如何:创建菜单上子菜单和快捷菜单

若要添加菜单到 Visual Studio 集成开发 (IDE)环境, VSPackage 必须为) 菜单使用 Visual Studio SDK 体系结构。 指令集菜单启用命令在元素和该环境重新使用和之间共享。 有关) 菜单的更多信息,请参见 Vspackage 如何将用户界面元素到 IDE

对于 Vspackage,菜单中 .vsct 文件的 菜单 部分定义。 .vsct 文件定义菜单和工具栏、组和命令。 命令是用户单击执行功能。 组是命令和菜单的容器。 菜单是组的容器。 因此,创建基本菜单,必须创建菜单命令、组和至少一个命令。

下面是针对三种基本的快捷菜单可以出现在 Visual Studio,例如:

  • 为主菜单栏的一个菜单。

  • 作为另一个菜单的子菜单。

  • 作为快捷菜单 (通常显示由右击)。

本主题演示如何创建每个菜单。 以下演练还演示如何执行此操作:

创建菜单上子菜单或快捷菜单

  1. 在项目中,双击 .vsct 文件在编辑器中将其打开。

    如果该项不具有一 .vsct 文件,请添加一个。 使用 Visual Studio 包模板,如果创建一个包,选择 菜单命令;执行此操作将生成一 .vsct 文件。

  2. 在 Symbols 部分,找到包含组和命令的 GuidSymbol 元素。

  3. 创建每个菜单,组一个 IDSymbol 元素或命令要添加,如下面的示例所示,。

    <GuidSymbol name="guidButtonGroupCmdSet" value="{f69209e9-975a-4543-821d-1f4a2c52d737}">
      <IDSymbol name="MyMenuGroup" value="0x1020" />
      <IDSymbol name="cmdidMyCommand" value="0x0100" />
    </GuidSymbol>
    

    GuidSymbol 和 IDSymbol 元素的 name 属性提供 GUID: ID 为每个新菜单、组或命令对。 GUID 表示为 VSPackage 定义设置的命令。 您可以定义多个命令设置。 每个 GUID: ID 匹配必须是唯一的。

  4. 定义在 Menus 部分的新菜单,如下所示:

    1. 设置 guid ,并 id 字段匹配 GUID: 新菜单的 ID。

    2. 设置 priority 特性。

      该 .vsct 用于 priority 属性确定菜单的位置在其他对象中的在父组中。

      较低优先级的值的菜单在具有较高优先级的值的菜单中显示。 重复优先级值,允许,但相同优先级 Vspackage 处理在运行时,因此,命令无法预先确定的顺序由菜单的相对位置。 省略 priority 属性将其值设置为 0。

      不要将快捷菜单中的一个优先级,,因为调用它的代码取决于其位置。

    3. 对于菜单和子菜单,设置 type 属性设置为 菜单,它描述了一个典型的菜单。 对于快捷菜单,设置 type 属性设置为 上下文。

      有关其他活动菜单类型的声明,如工具栏和菜单控制器,请参见 Menu 元素

    4. 在菜单上定义,请创建一个包含 ButtonText 元素包含菜单的一个 字符串 部分,它会显示 IDE 和 CommandName 元素的名称包含命令的名称用于访问菜单中 命令 窗口。

      如果按钮文本字符串中包含 " 字符,用户可以通过按 alt 键打开菜单以及紧跟在 " 的字符。

    5. 添加命令标志,根据需要,更改菜单的外观和行为。 为此,请添加到菜单定义的一个 CommandFlag 元素。 有关更多信息,请参见 Command Flag 元素

  5. 设置菜单的父级。 对于标准菜单或子菜单,请按照模型执行以下方式之一,例如:

    • 在 Menu 元素中,创建一个 元素并将其 guid 和 id 字段为 GUID: 承载菜单组,也称为 主父组的ID。 父组可以是您在 Symbols 部分、一组从另一个包或一组中创建从 IDE 的组。 例如,添加菜单到 IDE 的顶部菜单栏,在 工具 菜单附近,设置父到 guidSHLMainMenu: IDG_VS_MM_TOOLSADDINS.

      下面的示例演示将显示在 Visual Studio 菜单栏上的菜单。

      <Menu guid="guidTopLevelMenuCmdSet"
      id="TopLevelMenu" priority="0x700" type="Menu">
        <Parent guid="guidSHLMainMenu"
                id="IDG_VS_MM_TOOLSADDINS" />
        <Strings>
          <ButtonText>TestMenu</ButtonText>
          <CommandName>TestMenu</CommandName>
        </Strings>
      </Menu>
      
    • 使用命令,位置,因此,如果菜单将确定您可以省略 Parent 元素。 在 Symbols 部分之前创建一个 CommandPlacements 部分,并添加具有 GUID 的 CommandPlacement 元素: 菜单、优先级别和父项的 ID,如以下示例所示。

      <CommandPlacements>
        <CommandPlacement guid="guidButtonGroupCmdSet" id="cmdidMyCommand" priority="0x105">
          <Parent guid="guidButtonGroupCmdSet" id="MyMenuGroup" />
        </CommandPlacement>
      </CommandPlacements>
      

      创建具有相同的 GUID 的多个命令位置: ID 和具有不同的父原因出现的菜单于多个位置。 有关更多信息,请参见 CommandPlacements 元素

    标准菜单必须具有 Visual Studio 菜单栏上的一组作为其父级。 为子菜单,父必须是另一个菜单的一组 (但一个父菜单可能是工具栏或其他菜单类型)。 对于要显示的菜单或子菜单,它必须承载包含至少一个有效的命令组,或者将 AlwaysCreate 命令标志设置为。

    快捷菜单没有父级或命令位置。 相反,必须在代码中激活它们。 通常,快捷菜单激活响应中右击控件。 下面的示例定义一个快捷菜单。

    <Menu guid="guidButtonGroupCmdSet" id="ShortcutMenu"
          type="Context">
      <Strings>
        <ButtonText>Shortcut Menu</ButtonText>
        <CommandName>ShortcutMenu</CommandName>
      </Strings>
    </Menu>
    
  6. 部分中,创建一个 元素包含是出现在菜单的命令。 Symbols 部分必须包含具有相同的 GUID 的项: ID 作为新 Group 元素。

    1. 设置组来说,以便将显示到希望在菜单上的位置。

      每组边界菜单将作为水平线。

    2. 将此新组的父为 GUID: 您创建菜单的 ID。 在选项卡上执行此操作将菜单命令的组。

    下面的示例中的组显示在早期的示例中显示的顶级菜单。

     <Group guid="guidTopLevelMenuCmdSet" id="MyMenuGroup"
    priority="0x0600">
       <Parent guid="guidTopLevelMenuCmdSet" id="TopLevelMenu"/>
     </Group>
    

    通过将在下面的示例在一个组中显示顶级菜单的菜单,它成为子菜单。

    <Menu guid="guidTopLevelMenuCmdSet" id="SubMenu"
    priority="0x0100" type="Menu">
      <Parent guid="guidTopLevelMenuCmdSet" id="MyMenuGroup"/>
      <Strings>
        <ButtonText>Sub Menu</ButtonText>
        <CommandName>Sub Menu</CommandName>
      </Strings>
    </Menu>
    
  7. 命令添加到菜单通过创建命令项在 按钮 部分和设置每个的父级更改为 GUID: 组的 ID。 每个 按钮 元素必须具有 GUID: 对应于 Symbols 部分项的 ID。

    使用每个按钮项 priority 属性指定命令在组中显示的顺序。

    下面的示例定义一个将显示在顶级菜单上的命令。

    <Button guid="guidTopLevelMenuCmdSet" id="cmdidTestCommand" priority="0x0100" type="Button">
      <Parent guid="guidTopLevelMenuCmdSet" id="MyMenuGroup" />
      <Icon guid="guidImages" id="bmpPic1" />
      <Strings>
        <CommandName>cmdidTestCommand</CommandName>
        <ButtonText>Test Command</ButtonText>
      </Strings>
    </Button>
    

    有关按钮和菜单项的更多信息,请参见 Button 元素

    有关如何实现本主题中前面提到代码中的菜单命令的信息,请参见 如何:在 Vspackage (c#) 创建和处理命令 或演练。

激活快捷菜单

  1. 获取 GUID: 快捷菜单的 ID。 默认情况下,包模板。 PkgCmdID.cs 文件创建 GuidList 类将命令的 GUID 负设置。 模板在 PkgCmdId.cs 文件来创建 PkgCmdIdList 类表示在模板声明命令的整数 ID 值。 快捷菜单和所有其他命令,在模板完成后,必须声明。 下面的示例演示这些声明。

    static class PkgCmdIDList
    {
    
        public const uint cmdidColorChange =    0x101;
        public const int ColorMenu = 0x1000;
    
        public const int cmdidRed = 0x102;
        public const int cmdidYellow = 0x103;
        public const int cmdidBlue = 0x104;
    
    };
    

    ,如果将直接,使用 GUID 和 ID 值此步骤可以省略。 但是,我们建议您为可读性设置值示。

  2. 附加到事件处理程序。 通常,如下面的示例所示,快捷菜单附加到的右击控件,。

    private void MyToolWindow_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
    {
        OleMenuCommandService mcs = this._parent.mcs;
        if (null != mcs)
        {
            CommandID menuID = new CommandID(
                GuidList.guidTWShortcutMenuCmdSet,
                PkgCmdIDList.ColorMenu);
            Point p = this.PointToScreen(e.GetPosition(this));
            mcs.ShowContextMenu(menuID, (int)p.X, (int)p.Y);
        }
    }
    

    PointToScreen 方法将单击位置,是相对于控件,为屏幕位置。 ShowContextMenu 方法以显示快捷菜单。

    包含事件处理程序的文件必须包含 System.ComponentModel.Design 命名空间访问 OleMenuCommandService 类和 Microsoft.VisualStudio.Shell 命名空间访问 IMenuCommandService 接口。

    using Microsoft.VisualStudio.Shell;
    using System.ComponentModel.Design;
    

请参见

任务

如何:在 Vspackage (c#) 创建和处理命令

概念

VSCT XML 架构参考

其他资源

使用命令、菜单和工具栏的常规任务