新增工具視窗
在本逐步解說中,您將了解如何建立工具視窗,並以下列方式將其整合到 Visual Studio 中:
將控制項新增至工具視窗。
將工具列新增至工具視窗。
將命令新增至工具列。
實作命令。
設定工具視窗的預設位置。
必要條件
Visual Studio SDK 已作為選用功能包含在 Visual Studio 安裝程式中。 如需詳細資訊,請參閱安裝 Visual Studio SDK。
建立工具視窗
使用 VSIX 範本建立名為 FirstToolWindow 的專案,並新增名為 FirstToolWindow 的自定義工具視窗項目範本。
注意
如需使用工具視窗建立延伸模組的詳細資訊,請參閱使用工具視窗建立延伸模組。
將控制項新增至工具視窗
移除預設控制項。 開啟 FirstToolWindowControl.xaml,然後刪除 [按一下我!] 按鈕。
在 [工具箱] 中,展開 [所有 WPF 控制項] 區段,然後將 [媒體元素] 控制項拖曳至 [FirstToolWindowControl] 表單。 選取控制項,然後在 [屬性] 視窗中,將這個元素命名為 mediaElement1。
將工具列新增至工具視窗
透過下列方式新增工具列,確保其漸層和色彩與 IDE 的其餘部分一致。
在 [方案總管] 中,開啟 FirstToolWindowPackage.vsct。 .vsct 檔案會使用 XML 來定義工具視窗中的圖形化使用者介面 (GUI) 元素。
在
<Symbols>
區段中,尋找name
屬性為guidFirstToolWindowPackageCmdSet
的<GuidSymbol>
節點。 將下列兩個<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
屬性所定義。guid
和id
設定構成工具列的完整識別碼。 一般而言,功能表的<Parent>
是包含群組。 不過,工具列會定義為自身的父代。 因此,<Menu>
和<Parent>
元素會使用相同的識別碼。priority
屬性只是「0」。工具列在許多方面與功能表類似。 例如,就像功能表可能有命令群組一樣,工具列也可能有群組。 (在功能表上,命令群組會以水平線分隔。在工具列上,群組不會以視覺分隔符號分隔。)
新增包含
<Group>
元素的<Groups>
區段。 這會定義您在<Symbols>
區段中宣告其識別碼的群組。 在<Menus>
區段後面新增<Groups>
區段。<Groups> <Group guid="guidFirstToolWindowPackageCmdSet" id="ToolbarGroupID" priority="0x0000"> <Parent guid="guidFirstToolWindowPackageCmdSet" id="ToolbarID" /> </Group> </Groups>
將父系 GUID 和識別碼設定為工具列的 GUID 和識別碼,即可將群組新增至工具列。
將命令新增至工具列
將命令新增至工具列,這會顯示為按鈕。
在
<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 中,尋找
FirstToolWindowPackage
類別上的 ProvideToolWindowAttribute 屬性,該屬性會將 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,然後按 [開啟]。
您應該會聽到鈴聲。