相关文章推荐
愉快的柚子  ·  Apache Sqoop with ...·  1 年前    · 
内向的火柴  ·  396 ...·  2 年前    · 
虚心的豌豆  ·  郑惠南·  2 年前    · 

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

创建工具窗口

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

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

    向工具窗口添加控件

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

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

    将工具栏添加到工具窗口

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

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

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

    <IDSymbol name="ToolbarID" value="0x1000" />
    <IDSymbol name="ToolbarGroupID" value="0x1001" />
    
  • 在 <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”。

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

    <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,将组添加到工具栏。

    将命令添加到工具栏

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

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

    <IDSymbol name="cmdidWindowsMedia" value="0x0100" />
    <IDSymbol name="cmdidWindowsMediaOpen" value="0x132" />
    
  • 在 <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>
    
  • 打开 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; }
    

    实例化工具窗口和工具栏

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

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

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

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

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

    this.ToolBar = new CommandID(new Guid(FirstToolWindowCommand.guidFirstToolWindowPackageCmdSet),
        FirstToolWindowCommand.ToolbarID);
    this.ToolBarLocation = (int)VSTWT_LOCATION.VSTWT_TOP;
    
  • 此时,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;
    
  • 将菜单命令添加到工具栏。 在 FirstToolWindowCommand.cs 类中,添加以下 using 指令:

    using System.Windows.Forms;
    
  • 在 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);
    

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

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

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

    private FirstToolWindow window;
    
  • 更改 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);
    
  • 添加 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 文件中。

  • 在 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。

    测试工具窗口

  • 按 F5 打开 Visual Studio 实验版的新实例。

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

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

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

    你应该听到声音。

  • 命令、菜单和工具栏
  •