共用方式為


新增工具視窗

在本逐步解說中,您將了解如何建立工具視窗,並以下列方式將其整合到 Visual Studio 中:

  • 將控制項新增至工具視窗。

  • 將工具列新增至工具視窗。

  • 將命令新增至工具列。

  • 實作命令。

  • 設定工具視窗的預設位置。

必要條件

Visual Studio SDK 已作為選用功能包含在 Visual Studio 安裝程式中。 如需詳細資訊,請參閱安裝 Visual Studio SDK

建立工具視窗

  1. 使用 VSIX 範本建立名為 FirstToolWindow 的專案,並新增名為 FirstToolWindow自定義工具視窗項目範本。

    注意

    如需使用工具視窗建立延伸模組的詳細資訊,請參閱使用工具視窗建立延伸模組

將控制項新增至工具視窗

  1. 移除預設控制項。 開啟 FirstToolWindowControl.xaml,然後刪除 [按一下我!] 按鈕。

  2. 在 [工具箱] 中,展開 [所有 WPF 控制項] 區段,然後將 [媒體元素] 控制項拖曳至 [FirstToolWindowControl] 表單。 選取控制項,然後在 [屬性] 視窗中,將這個元素命名為 mediaElement1

將工具列新增至工具視窗

透過下列方式新增工具列,確保其漸層和色彩與 IDE 的其餘部分一致。

  1. 在 [方案總管] 中,開啟 FirstToolWindowPackage.vsct。 .vsct 檔案會使用 XML 來定義工具視窗中的圖形化使用者介面 (GUI) 元素。

  2. <Symbols> 區段中,尋找 name 屬性為 guidFirstToolWindowPackageCmdSet<GuidSymbol> 節點。 將下列兩個 <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 設定構成工具列的完整識別碼。 一般而言,功能表的 <Parent> 是包含群組。 不過,工具列會定義為自身的父代。 因此,<Menu><Parent> 元素會使用相同的識別碼。 priority 屬性只是「0」。

  4. 工具列在許多方面與功能表類似。 例如,就像功能表可能有命令群組一樣,工具列也可能有群組。 (在功能表上,命令群組會以水平線分隔。在工具列上,群組不會以視覺分隔符號分隔。)

    新增包含 <Group> 元素的 <Groups> 區段。 這會定義您在 <Symbols> 區段中宣告其識別碼的群組。 在 <Menus> 區段後面新增 <Groups> 區段。

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

    將父系 GUID 和識別碼設定為工具列的 GUID 和識別碼,即可將群組新增至工具列。

將命令新增至工具列

將命令新增至工具列,這會顯示為按鈕。

  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 中,尋找 FirstToolWindowPackage 類別上的 ProvideToolWindowAttribute 屬性,該屬性會將 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,然後按 [開啟]

    您應該會聽到鈴聲。