演练:实现在工具窗口中的快捷菜单

本演练演示将工具窗口将快捷菜单。 快捷菜单是出现的菜单上,当用户右击图形用户界面 (GUI)元素 (如按钮、文本框和窗口背景。 在快捷菜单上的命令的行为与在其他菜单或工具栏上的命令相同。 若要支持快捷菜单,请将其指定为在 XML 命令表 (.vsct) 文件并将其显示在响应鼠标的右击。

工具窗口包含在从 ToolWindowPane继承的自定义工具窗口类的 windows presentation foundation (WPF) 用户控件。

本演练演示 .vsct 文件演示如何创建快捷菜单作为 Visual Studio 菜单,通过声明菜单项,使用托管包结构然后实现它们在定义工具窗口的类。 此方法便于到 Visual Studio 命令、 UI 元素和自动化对象模型的访问。

,或者,如果快捷菜单未将访问 Visual Studio 功能,可以在用户控件中使用 XAML 元素的 ContextMenu 属性。 有关更多信息,请参见 ContextMenu

系统必备

若要完成本演练,您必须安装 Visual Studio 2010 SDK。

备注

有关 Visual Studio SDK 的更多信息,请参见 扩展 Visual Studio 概述。若要查找有关中所列如何下载 Visual Studio SDK,请 Visual Studio Extensibility Developer Center 参见 MSDN 网站上。

Visual Studio 包 " 项目模板的位置

Visual Studio 包 " 项目模板可在 新项目 对话框的三个位置:

  1. Visual Basic 扩展性下。 该项的默认语言是 Visual Basic。

  2. C# 扩展性下。 该项目的默认语言是 C#。

  3. 其他项目类型扩展性下。 该项的默认语言是 C++。

创建工具窗口快捷菜单包

创建 MyTWGradientPackage VSPackage

  • 创建 Visual Studio 包项名为 TWShortcutMenu。

    1. 在包向导,将语言对 Visual Basic 或 c#)。

    2. 选择选项创建工具窗口。

    3. 将工具窗口颜色更改 " 窗口,并将其命令 ID 设置为 cmdidColorChange。

指定快捷菜单

一个快捷菜单例如在本演练中所示) 允许用户从用于填充工具窗口的背景色的列表中选择。

创建快捷菜单

  1. 打开 MyTWGradientPackage.vsct。

  2. 符号 元素,在名为 “guidTWShortcutMenuCmdSet” GuidSymbol 元素,则以声明快捷菜单、快捷菜单组和菜单选项,如下所示。

    <IDSymbol name="ColorMenu" value="0x1000"/>
    <IDSymbol name="ColorGroup" value="0x1100"/>
    <IDSymbol name="cmdidRed" value="0x102"/>
    <IDSymbol name="cmdidYellow" value="0x103"/>
    <IDSymbol name="cmdidBlue" value="0x104"/>
    
  3. 元素之前,请创建一个 菜单 元素都定义中的快捷菜单。

    <Menus>
      <Menu guid="guidTWShortcutMenuCmdSet" id="ColorMenu" type="Context">
        <Strings>
          <ButtonText>Color change</ButtonText>
          <CommandName>ColorChange</CommandName>
        </Strings>
      </Menu>
    </Menus>
    

    ,因为它不是菜单或工具栏,的部分快捷菜单没有父级。

  4. 在 Groups 元素,请定义包含快捷菜单项的 元素,并将组和快捷菜单。

    <Group guid="guidTWShortcutMenuCmdSet" id="ColorGroup">
      <Parent guid="guidTWShortcutMenuCmdSet" id="ColorMenu"/>
    </Group>
    
  5. 按钮 元素,定义要显示在快捷菜单上的命令。

    <Button guid="guidTWShortcutMenuCmdSet" id="cmdidRed" priority="1" type="Button">
      <Parent guid="guidTWShortcutMenuCmdSet" id="ColorGroup" />
      <Strings>
        <ButtonText>Red</ButtonText>
      </Strings>
    </Button>
    
    <Button guid="guidTWShortcutMenuCmdSet" id="cmdidYellow" priority="3" type="Button">
      <Parent guid="guidTWShortcutMenuCmdSet" id="ColorGroup" />
      <Strings>
        <ButtonText>Yellow</ButtonText>
      </Strings>
    </Button>
    
    <Button guid="guidTWShortcutMenuCmdSet" id="cmdidBlue" priority="5" type="Button">
      <Parent guid="guidTWShortcutMenuCmdSet" id="ColorGroup" />
      <Strings>
        <ButtonText>Blue</ButtonText>
      </Strings>
    </Button>
    
  6. 打开 PkgCmdID.vb 或 PkgCmdID.cs。

  7. 添加快捷菜单和菜单项的定义。

    public const int ColorMenu = 0x1000;
    
    public const int cmdidRed = 0x102;
    public const int cmdidYellow = 0x103;
    public const int cmdidBlue = 0x104;
    

    这些是在 TWShortcutMenu.vsct 文件的 Symbols 部分定义相同的命令 ID。 ,因为在 .vsct 文件,只需要上下文组此处不包括。

  8. 保存并生成解决方案。

实现快捷菜单

本节实现快捷菜单及其命令。

实现快捷菜单

  1. 打开 MyToolWindow.vb 或 MyToolWindow.cs。

    MyToolWindow 类访问菜单命令服务的,但是,它不承载的用户控件。 接下来的三个步骤演示如何使实例菜单命令服务可由工具窗口向用户控件。

  2. 添加 System.ComponentModel.Design 命名空间。

    using System.ComponentModel.Design;
    
  3. 添加一个变量来保存菜单命令 services 实例。

    internal OleMenuCommandService mcs;
    
  4. 在构造函数的末尾,添加调用菜单命令服务并修改调用转换为 base.Content,如下所示。

    mcs = GetService(typeof(IMenuCommandService)) as OleMenuCommandService;
    base.Content = new MyControl(this);
    

    调用构造函数的菜单命令服务确保是内存中,只要工具窗口处于打开状态。 通过工具窗口的实例作为参数传递给控件构造函数使控件使对该工具窗口类的成员。

  5. 打开 MyControl.xaml。

    此文件表示在工具窗口中显示的用户控件。

  6. 添加一个 MouseRightButtonDown 事件到顶级 UserControl 元素。

    MouseRightButtonDown="MyToolWindow_MouseRightButtonDown"
    
  7. 右击所添加然后单击 定位到事件处理程序的事件声明。

    这将打开 MyControl.xaml.vb 或 MyControl.xaml.cs 并创建事件处理程序的存根。

  8. 在 MyControl 顶部,添加 Microsoft.VisualStudio.ShellSystem.ComponentModel.Design 命名空间。

    using Microsoft.VisualStudio.Shell;
    using System.ComponentModel.Design;
    
  9. 添加字段保留对父工具窗口,而如下所示修改构造函数。

    MyToolWindow _parent;
    public MyControl(MyToolWindow parent)
    {
        InitializeComponent();
        _parent = parent;
    
        OleMenuCommandService mcs = this._parent.mcs;
        if (null != mcs)
        {
            // Create an alias for the command set guid.
            Guid g = GuidList.guidTWShortcutMenuCmdSet;
    
            // Create the command IDs. 
            var red = new CommandID(g, PkgCmdIDList.cmdidRed);
            var yellow = new CommandID(g, PkgCmdIDList.cmdidYellow);
            var blue = new CommandID(g, PkgCmdIDList.cmdidBlue);
    
            // Add a command for each command ID.
            mcs.AddCommand(new MenuCommand(ChangeColor, red));
            mcs.AddCommand(new MenuCommand(ChangeColor, yellow));
            mcs.AddCommand(new MenuCommand(ChangeColor, blue));
        }
    }
    

    构造函数在 _parent 字段现在采用父工具窗口实例作为参数,并将其存储。 表示菜单命令在 .vsct 文件中定义的然后创建从命令设置的 GUID 的 CommandID 对象和 PkgCmdList 值。 最后,它将命令添加到菜单命令服务并将事件处理程序。

  10. 按如下方式实现 MyToolWindowMouseRightButtonDown 事件。

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

    使用 ShowContextMenu 方法,则在该位置创建快捷菜单的一 CommandID 对象,确定鼠标单击的位置,并打开快捷菜单。

  11. 实现事件,在构造函数定义,用户的单击菜单项。

            private void ChangeColor(object sender, EventArgs e )
            {
                var mc = sender as MenuCommand;
    
                switch (mc.CommandID.ID)
                {
                    case PkgCmdIDList.cmdidRed:
                        MyToolWindow.Background = Brushes.Red;
                        break;
                    case PkgCmdIDList.cmdidYellow:
                        MyToolWindow.Background = Brushes.Yellow;
                        break;
                    case PkgCmdIDList.cmdidBlue:
                        MyToolWindow.Background = Brushes.Blue;
                        break;
                }
            }
    

    在这种情况下,一个方法所有的事件菜单项传递标识 CommandID 并设置背景相应的颜色。 如果菜单项包含了无关的命令,可以创建每个命令的单独事件处理程序。

测试工具窗口功能

本节演示如何演示本演练中添加的功能。

测试工具窗口功能

  1. 按 F5 打开 Visual Studio的实验实例。

  2. 在的实验实例中,在 视图 菜单上,单击 其他窗口 然后单击 颜色更改 " 窗口。 执行此操作应显示工具窗口。

  3. 右击工具窗口背景,其中按钮。 具有颜色列表的快捷菜单应显示。

  4. 单击颜色在快捷菜单上。 快捷菜单应消失,因此,应将工具窗口背景色更改为选定的颜色。

后续步骤

如果通过修改 .vsct 文件更改快捷菜单,则必须重新生成 MyTWGradientPackageUI 项目。 执行此强制 .vsct 文件重新生成并使用对 .vsct 文件的更改是重新链接附属 DLL。

请参见

其他资源

命令、菜单和工具栏的演练

命令、菜单和工具栏

服务