在实现在 VSPackage 后的命令处理模式,可以添加代码以更新用户界面 (UI)在新命令的状态。
在典型的 Win32 应用程序中,设置的命令可以持续投票,各个命令的状态可以调整为用户查看它们。 但是,在中,因为 Visual Studio shell 可承载的数量没有限制。 Vspackage,广泛的轮询可能降低响应能力,尤其是轮询在托管代码和 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),则更新同步并立即执行。 我们建议您通过零 (0)FALSE) 此参数的可帮助保持良好的性能。 如果要避免缓存,请应用 DontCache 标志,在 .vsct 文件时创建命令。 但是,请在地使用标志或性能可能会降低。 有关标志的更多信息,请参见 Command Flag 元素 文档。
通过在窗口中,的就地激活方式在承载 Activex 控件的 Vspackage,使用 UpdateUI 方法可能会更方便。 在 IVsUIShell 接口的 UpdateCommandUI 方法以及在 IOleInPlaceComponentUIManager 接口的 UpdateUI 方法在功能上等效。 两个生成环境再次查询任何命令状态。 通常,更新不会立即执行。 相反,更新将延迟到空闲时间。 shell 缓存帮助的顺序维护状态很好的性能。 如果要避免缓存,请应用 DontCache 标志,在 .vsct 文件时创建命令。 但是,在中,因为性能可能会降低,请在地使用标志。
注意可以获取 IOleInPlaceComponentUIManager 接口通过调用 IOleComponentUIManager 对象的 QueryInterface 方法或通过从 SOleComponentUIManager 服务的接口。