在实现在 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 服务的接口。

请参见

概念

Vspackage 如何将用户界面元素到 IDE

命令实现