在您的 VSPackage 中執行的命令處理配置後,您可以新增程式碼來更新使用者介面 (UI),與您的新命令的狀態。
在典型的 Win32 應用程式中,可以持續地輪詢命令集,可調整的個別命令的狀態,如同在使用者可以檢視它們。 不過,因為Visual Studio shell 可以存放無數個 VSPackages、 廣泛的輪詢可能會降低回應速度,尤其輪詢跨 interop 組件之間的 managed 程式碼與 com。
若要更新 UI
請執行下列其中一個步驟:
呼叫 UpdateCommandUI 方法。
IVsUIShell介面可以取自SVsUIShell服務,如下所示。
Private Sub UpdateUI(ByVal sp As Microsoft.VisualStudio.Shell.ServiceProvider) Dim vsShell As IVsUIShell = DirectCast(sp.GetService(GetType(IVsUIShell)), IVsUIShell) If vsShell IsNot Nothing Then Dim hr As Integer = vsShell.UpdateCommandUI(0) Microsoft.VisualStudio.ErrorHandler.ThrowOnFailure(hr) End If End Sub
void UpdateUI(Microsoft.VisualStudio.Shell.ServiceProvider sp) { IVsUIShell vsShell = (IVsUIShell)sp.GetService(typeof(IVsUIShell)); if (vsShell != null) { int hr = vsShell.UpdateCommandUI(0); Microsoft.VisualStudio.ErrorHandler.ThrowOnFailure(hr); } }
void UpdateUI(IServiceProvider *pSP) { CComPtr< IVsUIShell> srpShell; int hresult = pSP->QueryService(SID_SVsUIShell, IID_IVsUIShell, (void **)&srpShell); if (SUCCEEDED(hresult) && NULL != srpShell) { sprShell->UpdateCommandUI(FALSE); } }
如果參數的UpdateCommandUI為非零 (TRUE),然後以同步方式與立即執行更新。 我們建議您傳遞零 (FALSE) 這個參數,以協助維護良好的效能。 如果您想要避免快取時,會套用DontCache .vsct 檔案中建立的命令時的旗標。 不過,謹慎使用旗標,或者可能會降低效能。 如需有關命令旗標的詳細資訊,請參閱CommandFlag 項目文件。
在使用 [就地啟動模式],請在視窗中裝載 ActiveX 控制項的 VSPackages,可能還要方便使用UpdateUI方法。 UpdateCommandUI中的方法IVsUIShell介面和UpdateUI中的方法IOleInPlaceComponentUIManager介面的功能相同。 兩者會造成環境,以重新查詢所有命令的狀態。 一般而言,更新就不會立即執行。 相反地,更新已延遲到閒置的時間。 殼層會快取的命令狀態,以協助維護良好的效能。 如果您想要避免快取時,會套用DontCache .vsct 檔案中建立的命令時的旗標。 不過,使用旗標謹慎,因為可能會降低效能。
請注意,您可以取得IOleInPlaceComponentUIManager介面,藉由呼叫QueryInterface上的方法IOleComponentUIManager物件,或藉由取得介面,從SOleComponentUIManager服務。