命令路由算法

在 Visual Studio 命令中,由许多不同的组件处理。 命令从最内部的上下文(基于当前选择)路由到最外部(也称为全局)上下文。 有关详细信息,请参阅 命令可用性

命令解析顺序

命令通过以下级别的命令上下文传递:

  1. 加载项:环境首先向存在的任何加载项提供命令。

  2. 优先级命令:使用 注册 IVsRegisterPriorityCommandTarget这些命令。 它们针对 Visual Studio 中的每个命令调用,并按注册顺序调用。

  3. 上下文菜单命令:首先向提供给上下文菜单的命令目标提供位于上下文菜单上的命令,然后提供给典型的路由。

  4. 工具栏集命令目标:调用 SetupToolbar2时会注册这些命令目标。 参数 pCmdTarget 可以是 null. 如果不是 null,则此命令目标用于更新设置的工具栏上的任何命令。 如果 shell 正在设置工具栏,则它将窗口框架作为窗口框架传递, pCmdTarget 以便工具栏上命令的所有更新都流经窗口框架,即使它不处于焦点中也是如此。

  5. 工具窗口:通常实现 IVsWindowPane 接口的工具窗口还应实现 IOleCommandTarget 接口,以便在工具窗口是活动窗口时,Visual Studio 可以获取命令目标。 但是,如果具有焦点的工具窗口是 “项目” 窗口,则命令将路由到 IVsUIHierarchy 接口,该接口是所选项的常见父级。 如果此选择跨越多个项目,则命令将路由到 IVsSolution 层次结构。 该IVsUIHierarchy接口包含QueryStatusCommand与接口上的IOleCommandTarget相应命令类似的方法和ExecCommand方法。

  6. 文档窗口:如果命令在其 RouteToDocs.vsct 文件中设置了标志,则 Visual Studio 在文档视图对象上查找命令目标,该对象是接口的实例 IVsWindowPane 或文档对象的实例(通常是 IVsTextLines 接口或 IVsTextBuffer 接口)。 如果文档视图对象不支持该命令,Visual Studio 会将该命令路由到返回的 IOleCommandTarget 接口。 (这是文档数据对象的可选接口。

  7. 当前层次结构:当前层次结构可以是拥有活动文档窗口的项目,也可以是解决方案资源管理器中选择的层次结构。 Visual Studio 查找 IOleCommandTarget 在当前或活动层次结构上实现的接口。 层次结构应支持每当层次结构处于活动状态时有效的命令,即使项目项的文档窗口具有焦点也是如此。 但是,仅当解决方案资源管理器具有焦点时才应用的命令必须通过使用IVsUIHierarchy接口及其QueryStatusCommand方法和ExecCommand方法来支持。

    剪切复制粘贴删除重命名EnterDoubleClick 命令需要特殊处理。 有关如何在层次结构中处理 DeleteRemove 命令的信息,请参阅该 IVsHierarchyDeleteHandler 接口。

  8. 全局:如果以前提及上下文尚未处理命令,Visual Studio 将尝试将其路由到拥有实现接口的命令的 IOleCommandTarget VSPackage。 如果 VSPackage 尚未加载,则 Visual Studio 调用 QueryStatus 该方法时不会加载它。 仅当调用该方法时 Exec ,才会加载 VSPackage。