在本逐步解說中,您將瞭解如何建立工具視窗,並以下列方式將其整合到 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
從工具列控件的事件處理程式中,您的程式代碼必須能夠存取 Media Player 控件,這是 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 方法,以叫用 [Open File] 對話框。 選取檔案時,它會播放媒體檔案。
在 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,然後按 Open。
你應該聽到鐘聲。