添加工具窗口

在本演练中,你将了解如何创建工具窗口并将其集成到 Visual Studio 中,方法如下:

  • 向工具窗口添加控件。

  • 将工具栏添加到工具窗口。

  • 将命令添加到工具栏。

  • 实现命令。

  • 设置工具窗口的默认位置。

先决条件

Visual Studio SDK 作为 Visual Studio 设置中的可选功能包含在内。 有关详细信息,请参阅 安装 Visual Studio SDK

创建工具窗口

  1. 使用 VSIX 模板创建名为 FirstToolWin 的项目,并添加名为 FirstToolWindow 的自定义工具窗口项模板。

    注意

    有关使用工具窗口创建扩展的详细信息,请参阅 使用工具窗口创建扩展。

向工具窗口添加控件

  1. 删除默认控件。 打开 FirstToolWindowControl.xaml 并删除 “单击我!” 按钮。

  2. 在工具箱中,展开“所有 WPF 控件”部分,并将媒体元素控件拖动到 FirstToolWindowControl 窗体。 选择控件,然后在 “属性” 窗口中将此元素 命名为 mediaElement1

将工具栏添加到工具窗口

通过采用以下方式添加工具栏,可以保证其渐变和颜色与 IDE 的其余部分保持一致。

  1. 解决方案资源管理器中,打开 FirstToolWindowPackage.vsct.vsct 文件使用 XML 定义工具窗口中的图形用户界面(GUI)元素。

  2. 在节中<Symbols>,找到<GuidSymbol>其属性为 guidFirstToolWindowPackageCmdSet. 的name节点。 将以下两 <IDSymbol> 个元素添加到此节点中的元素列表中 <IDSymbol> ,以定义工具栏和工具栏组。

    <IDSymbol name="ToolbarID" value="0x1000" />
    <IDSymbol name="ToolbarGroupID" value="0x1001" />
    
  3. <Buttons> 节的正上方,创建 <Menus> 如下所示的分区:

    <Menus>
        <Menu guid="guidFirstToolWindowPackageCmdSet" id="ToolbarID" priority="0x0000" type="ToolWindowToolbar">
            <Parent guid="guidFirstToolWindowPackageCmdSet" id="ToolbarID" />
            <Strings>
                <ButtonText>Tool Window Toolbar</ButtonText>
                <CommandName>Tool Window Toolbar</CommandName>
            </Strings>
        </Menu>
    </Menus>
    

    有多种不同类型的菜单。 此菜单是工具窗口中的工具栏,由其 type 属性定义。 设置guidid构成工具栏的完全限定 ID。 通常, <Parent> 菜单是包含组。 但是,工具栏被定义为其自己的父级。 因此,对元素<Parent>使用相同的<Menu>标识符。 该 priority 属性仅为“0”。

  4. 工具栏在许多方面都类似于菜单。 例如,就像菜单可能有一组命令一样,工具栏也可能具有组。 (在菜单上,命令组由水平线分隔。在工具栏上,组不由视觉分隔符分隔。

    <Groups>添加包含元素的<Group>节。 这将定义在节中 <Symbols> 声明的 ID 的组。 在 <Groups> 节后面 <Menus> 添加分区。

    <Groups>
        <Group guid="guidFirstToolWindowPackageCmdSet" id="ToolbarGroupID" priority="0x0000">
            <Parent guid="guidFirstToolWindowPackageCmdSet" id="ToolbarID" />
        </Group>
    </Groups>
    

    通过将父 GUID 和 ID 设置为工具栏的 GUID 和 ID,将组添加到工具栏。

将命令添加到工具栏

将命令添加到工具栏,该工具栏显示为按钮。

  1. 在该 <Symbols> 部分中,在工具栏和工具栏组声明之后声明以下 IDSymbol 元素。

    <IDSymbol name="cmdidWindowsMedia" value="0x0100" />
    <IDSymbol name="cmdidWindowsMediaOpen" value="0x132" />
    
  2. <Buttons> 节中添加 Button 元素。 此元素将显示在工具窗口中的工具栏上,并带有 “搜索 ”(放大镜)图标。

    <Button guid="guidFirstToolWindowPackageCmdSet" id="cmdidWindowsMediaOpen" priority="0x0101" type="Button">
        <Parent guid="guidFirstToolWindowPackageCmdSet" id="ToolbarGroupID"/>
        <Icon guid="guidImages" id="bmpPicSearch" />
        <Strings>
            <CommandName>cmdidWindowsMediaOpen</CommandName>
            <ButtonText>Load File</ButtonText>
        </Strings>
    </Button>
    
  3. 打开 FirstToolWindowCommand.cs ,并在现有字段之后在类中添加以下行。

    public const string guidFirstToolWindowPackageCmdSet = "00000000-0000-0000-0000-0000";  // get the GUID from the .vsct file
    public const uint cmdidWindowsMedia = 0x100;
    public const int cmdidWindowsMediaOpen = 0x132;
    public const int ToolbarID = 0x1000;
    

    这样做会使命令在代码中可用。

将 MediaPlayer 属性添加到 FirstToolWindowControl

从工具栏控件的事件处理程序中,代码必须能够访问媒体播放器控件,该控件是 FirstToolWindowControl 类的子级。

解决方案资源管理器中,右键单击 FirstToolWindowControl.xaml,单击“查看代码,并将以下代码添加到 FirstToolWindowControl 类。

public System.Windows.Controls.MediaElement MediaPlayer
{
    get { return mediaElement1; }
}

实例化工具窗口和工具栏

添加一个工具栏和一个菜单命令,该命令调用 “打开文件 ”对话框并播放所选媒体文件。

  1. 打开 FirstToolWindow.cs 并添加以下 using 指令:

    using System.ComponentModel.Design;
    using System.Windows.Forms;
    using Microsoft.VisualStudio.Shell.Interop;
    
  2. 在 FirstToolWindow 类中,添加对 FirstToolWindowControl 控件的公共引用。

    public FirstToolWindowControl control;
    
  3. 构造函数的末尾,将此控件变量设置为新创建的控件。

    control = new FirstToolWindowControl();
    base.Content = control;
    
  4. 实例化构造函数内的工具栏。

    this.ToolBar = new CommandID(new Guid(FirstToolWindowCommand.guidFirstToolWindowPackageCmdSet),
        FirstToolWindowCommand.ToolbarID);
    this.ToolBarLocation = (int)VSTWT_LOCATION.VSTWT_TOP;
    
  5. 此时,FirstToolWindow 构造函数应如下所示:

    public FirstToolWindow() : base(null)
    {
        this.Caption = "FirstToolWindow";
        this.BitmapResourceID = 301;
        this.BitmapIndex = 1;
        control = new FirstToolWindowControl();
        base.Content = control;
        this.ToolBar = new CommandID(new Guid(FirstToolWindowCommand.guidFirstToolWindowPackageCmdSet),
            FirstToolWindowCommand.ToolbarID);
            this.ToolBarLocation = (int)VSTWT_LOCATION.VSTWT_TOP;
    }
    
  6. 将菜单命令添加到工具栏。 在 FirstToolWindowCommand.cs 类中,添加以下 using 指令:

    using System.Windows.Forms;
    
  7. 在 FirstToolWindowCommand 类中,在 ShowToolWindow() 方法的末尾添加以下代码。 ButtonHandler 命令将在下一部分中实现。

    // Create the handles for the toolbar command.
    var mcs = this.ServiceProvider.GetService(typeof(IMenuCommandService)) as OleMenuCommandService;
    var toolbarbtnCmdID = new CommandID(new Guid(FirstToolWindowCommand.guidFirstToolWindowPackageCmdSet),
        FirstToolWindowCommand.cmdidWindowsMediaOpen);
    var menuItem = new MenuCommand(new EventHandler(
        ButtonHandler), toolbarbtnCmdID);
    mcs.AddCommand(menuItem);
    

在工具窗口中实现菜单命令

  1. 在 FirstToolWindowCommand 类中,添加调用“打开文件”对话框的 ButtonHandler 方法。 选择文件时,它会播放媒体文件。

  2. 在 FirstToolWindowCommand 类中,添加对在 FindToolWindow() 方法中创建的 FirstToolWindow 窗口的专用引用。

    private FirstToolWindow window;
    
  3. 更改 ShowToolWindow() 方法以设置上面定义的窗口(以便 ButtonHandler 命令处理程序可以访问窗口控件)。 下面是完整的 ShowToolWindow() 方法。

    private void ShowToolWindow(object sender, EventArgs e)
    {
        window = (FirstToolWindow) this.package.FindToolWindow(typeof(FirstToolWindow), 0, true);
        if ((null == window) || (null == window.Frame))
        {
            throw new NotSupportedException("Cannot create tool window");
        }
    
        IVsWindowFrame windowFrame = (IVsWindowFrame)window.Frame;
        Microsoft.VisualStudio.ErrorHandler.ThrowOnFailure(windowFrame.Show());
    
        var mcs = this.ServiceProvider.GetService(typeof(IMenuCommandService)) as OleMenuCommandService;
        var toolbarbtnCmdID = new CommandID(new Guid(FirstToolWindowCommandguidFirstToolWindowPackageCmdSet),
            FirstToolWindowCommand.cmdidWindowsMediaOpen);
        var menuItem = new MenuCommand(new EventHandler(
            ButtonHandler), toolbarbtnCmdID);
        mcs.AddCommand(menuItem);
    }
    
  4. 添加 ButtonHandler 方法。 它为用户创建 OpenFileDialog 以指定要播放的媒体文件,然后播放所选文件。

    private void ButtonHandler(object sender, EventArgs arguments)
    {
        OpenFileDialog openFileDialog = new OpenFileDialog();
        DialogResult result = openFileDialog.ShowDialog();
        if (result == DialogResult.OK)
        {
            window.control.MediaPlayer.Source = new System.Uri(openFileDialog.FileName);
        }
    }
    

设置工具窗口的默认位置

接下来,在 IDE 中为工具窗口指定默认位置。 工具窗口的配置信息位于 FirstToolWindowPackage.cs 文件中。

  1. FirstToolWindowPackage.cs 中,查找 ProvideToolWindowAttribute 类上的 FirstToolWindowPackage 属性,该属性将 FirstToolWindow 类型传递给构造函数。 若要指定默认位置,必须向以下示例的构造函数添加更多参数。

    [ProvideToolWindow(typeof(FirstToolWindow),
        Style = Microsoft.VisualStudio.Shell.VsDockStyle.Tabbed,
        Window = "3ae79031-e1bc-11d0-8f78-00a0c9110057")]
    

    第一个命名参数是 Style 及其值 Tabbed,这意味着窗口将是现有窗口中的选项卡。 停靠位置由Window参数指定,在本例中为解决方案资源管理器GUID。

    注意

    有关 IDE 中窗口类型的详细信息,请参阅 vsWindowType

测试工具窗口

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

  2. “视图 ”菜单上,指向 “其他窗口 ”,然后单击“ 第一个工具窗口”。

    媒体播放器工具窗口应以与解决方案资源管理器相同的位置打开。 如果它仍然与之前的位置相同,请重置窗口布局(窗口/重置窗口布局)。

  3. 单击工具窗口中的 按钮(它具有“搜索 ”图标)。 选择受支持的声音或视频文件,例如 C:\windows\media\chimes.wav,然后按 Open

    你应该听到声音。