更新用户接口

实现命令后,可以添加代码以使用新命令的状态更新用户界面。

在典型的 Win32 应用程序中,可以持续轮询命令集,并且可以在用户查看命令时调整各个命令的状态。 但是,由于 Visual Studio shell 可以托管无限数量的 VSPackage,因此广泛的轮询可能会降低响应能力,尤其是在托管代码和 COM 之间的互操作程序集之间轮询。

更新 UI

  1. 执行以下步骤之一:

    • 调用 UpdateCommandUI 方法。

      IVsUIShell可以从服务获取SVsUIShell接口,如下所示。

      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);
          }
      }
      
      

      如果参数 UpdateCommandUI 为非零(TRUE),则同步且立即执行更新。 建议为此参数传递零(FALSE),以帮助保持良好的性能。 如果要避免缓存,请在 DontCache .vsct 文件中创建命令时应用标志。 不过,请谨慎使用标志或性能可能会降低。 有关命令标志的详细信息,请参阅 Command Flag 元素 文档。

    • 在使用窗口中的就地激活模型托管 ActiveX 控件的 VSPackage 中,使用 UpdateUI 该方法可能更方便。 UpdateCommandUI接口UpdateUI中的IVsUIShell方法和接口中IOleInPlaceComponentUIManager的方法在功能上是等效的。 这两者都会导致环境重新查询所有命令的状态。 通常,不会立即执行更新。 相反,更新会延迟到空闲时间。 shell 会缓存命令状态,以帮助保持良好的性能。 如果要避免缓存,请在 DontCache .vsct 文件中创建命令时应用标志。 不过,请谨慎使用标志,因为性能可能会降低。

      请注意,可以通过对IOleComponentUIManager对象调用QueryInterface方法或通过从SOleComponentUIManager服务获取接口来获取IOleInPlaceComponentUIManager接口。