命令设计

将命令添加到 VSPackage 时,必须指定其显示位置、何时可用以及如何处理它。

定义命令

若要定义新命令,请在 VSPackage 项目中包括 Visual Studio 命令表 (.vsct) 文件。 如果使用 Visual Studio 包模板创建了 VSPackage,则项目将包含其中一个文件。 有关详细信息,请参阅 Visual Studio 命令表 (.vsct) 文件

Visual Studio 合并它找到的所有 .vsct 文件,以便它可以显示命令。 由于这些文件不同于 VSPackage 二进制文件,因此 Visual Studio 无需加载包来查找命令。 有关详细信息,请参阅 VSPackages 如何添加用户界面元素

Visual Studio 使用 ProvideMenuResourceAttribute 注册属性来定义菜单资源和命令。 有关详细信息,请参阅 命令实现

可以在运行时以多种方式更改命令。 可以显示或隐藏、启用或禁用它们。 它们可以显示不同的文本或图标,或包含不同的值。 在 Visual Studio 加载 VSPackage 之前,可能会执行大量自定义。 有关详细信息,请参阅 VSPackages 如何添加用户界面元素

命令处理程序

创建命令时,必须提供事件处理程序来执行该命令。 如果用户选择该命令,则必须对其进行适当路由。 路由命令意味着将其发送到正确的 VSPackage 以启用或禁用它,隐藏或显示它,并在用户选择执行此操作时执行该命令。 有关详细信息,请参阅 命令路由算法

Visual Studio 命令环境

Visual Studio 可以托管任意数量的 VSPackage,并且每个 VSPackage 都可以贡献自己的命令集。 环境仅显示适用于当前任务的命令。 有关详细信息,请参阅 命令可用性选择上下文对象

定义新命令、菜单、工具栏或快捷菜单的 VSPackage 在安装时通过引用本机或托管程序集中的资源的注册表项将其命令信息提供给 Visual Studio。 然后,每个资源都引用二进制数据资源 (.cto) 文件,该文件是在编译 Visual Studio 命令表 (.vsct) 文件时生成的。 这使 Visual Studio 能够提供合并的命令集、菜单和工具栏,而无需加载每个已安装的 VSPackage。

命令组织

环境按组、优先级和菜单定位命令。

  • 组是相关命令的逻辑集合,例如 “剪切”、“ 复制”和 “粘贴” 命令组。 组是在菜单上显示的命令。

  • 优先级确定组中各个命令在菜单上显示的顺序。

  • 菜单充当组的容器。

    环境预定义了某些命令、组和菜单。 有关详细信息,请参阅 默认命令、组和工具栏位置

    可以将命令分配给主组。 主组控制命令在主菜单结构和“ 自定义 ”对话框中的位置。 命令可以出现在多个组中;例如,命令可以位于主菜单、快捷菜单上和工具栏上。 有关详细信息,请参阅 VSPackages 如何添加用户界面元素

命令路由

对 VSPackage 调用和路由命令的过程不同于对对象实例调用方法的过程。

环境按顺序将命令从最内部的(本地)命令上下文(基于当前选择)路由到最外层(全局)上下文。 能够执行命令的第一个上下文是处理命令的第一个上下文。 有关详细信息,请参阅 命令路由算法

在大多数情况下,环境使用 IOleCommandTarget 接口处理命令。 由于命令路由方案允许许多不同的对象处理命令, IOleCommandTarget 因此可由任意数量的对象实现;其中包括 Microsoft ActiveX 控件、窗口视图实现、文档对象、项目层次结构和 VSPackage 对象本身(对于全局命令)。 在某些情况下,例如,层次结构 IVsHierarchy 中的路由命令必须实现接口。

Title 说明
命令实现 介绍如何在 VSPackage 中实现命令。
命令可用性 介绍 Visual Studio 上下文如何确定哪些命令可用。
命令路由算法 介绍 Visual Studio 命令路由体系结构如何使命令能够由不同的 VSPackage 处理。
命令放置指南 建议如何在 Visual Studio 环境中定位命令。
VSPackage 如何添加用户界面元素 介绍 VSPackage 如何最好地利用 Visual Studio 命令体系结构。
默认命令、组和工具栏位置 介绍 VSPackages 如何最好地使用 Visual Studio 中包含的命令。
管理 VSPackages 介绍 Visual Studio 如何加载 VSPackage。
Visual Studio 命令表 (.vsct) 文件 提供有关基于 XML 的 .vsct 文件的信息,这些文件用于描述 VSPackages 中命令的布局和外观。