逐步解說: 建立工具視窗 (第 2 部,共 4)
工具視窗都有 Visual Studio 的整合式的開發環境 (IDE) 中。 Visual Studio 中所包含的工具視窗的範例是方案總管] 中, 工作清單, 錯誤清單,以及 輸出視窗。 所有工具視窗都有一些功能共通點,比方說,所有可停駐在 IDE 中以相同的方式。 可預測的停駐功能可讓使用者有效率地管理他們的工作和資訊。
本逐步解說會教導如何建立 Visual Studio 的 IDE 中的一個工具視窗,使用下列步驟:
建立工具視窗。
在 [工具] 視窗中內嵌控制項。
將工具列新增到 [工具] 視窗。
將指令新增至工具列。
實作命令。
設定 [工具] 視窗的預設位置。
這個逐步解說會教導如何擴充 Visual Studio 的 IDE 的一系列的一部份。 如需詳細資訊,請參閱 使用 VSPackages 自訂 Visual Studio 的逐步解說。
必要條件
若要完成這個逐步解說中,您必須安裝Visual Studio 2010 SDK。
![]() |
---|
如需有關 Visual Studio 的 SDK 的詳細資訊,請參閱擴充 Visual Studio 的概觀。若要了解如何下載 Visual Studio 的 SDK,請參閱Visual Studio 擴充性開發人員中心 MSDN 網站上。 |
Visual Studio 的封裝專案範本的位置
Visual Studio 的封裝的專案範本有三個位置都在新的專案對話方塊:
在 Visual Basic 擴充性。 專案的預設語言是 Visual Basic。
在 C# 擴充性。 專案的預設語言是 C#。
在其他專案類型擴充性。 專案的預設語言是 c + +。
建立工具視窗
若要建立工具視窗
建立名為 VSPackage FirstToolWin。 您也可以建立方案目錄。 按一下 [確定]。
在 [歡迎使用] 頁面上,按一下 下。
在選取程式語言 頁面上,按一下 視覺 C# 或 Visual Basic 按一下產生新的金鑰檔簽署組件,然後按一下 [ 下一步。
請花一點時間來檢查 VSPackage 的基本資訊頁面。 中的值公司名稱方塊用來作為命名空間,專案中的所有類別。 VSPackage 名稱 ] 方塊中提供的最終編譯過的封裝名稱,並 VSPackage 版本 ] 方塊中提供的版本資訊。 最小的 Visual Studio 版本指定套件應該在執行 Visual Studio 的版本。 內容的的詳細的資訊完成套件的 [內容] 頁面上會出現方塊。 變更圖示 ] 按鈕可讓您選取的圖示代表套件。
這個逐步解說中,只接受預設值 」,即可下。
在選取 VSPackage 選項 頁面上,選取 功能表命令 和 工具視窗,然後按一下 [ 下一步。
注意事項
在下一個逐步解說中,必須使用的功能表命令選項逐步解說: 擴充的工具視窗 (第 3 部,共 4),這是根據這個專案。
在功能表命令選項 一頁,在 指令名稱 方塊中,輸入 Windows Media。 在命令 ID 方塊中,輸入 cmdidWindowsMedia,然後按一下 [ 下一步。
在工具視窗選項 一頁,在 視窗名稱 方塊中,輸入 Windows Media Player。 在命令 ID 欄位,輸入有效的識別項,例如, cmdidWindowsMediaWin,然後按一下 [ 下一步。
在選取測試專案選項 頁面上,清除 整合測試專案 和 單元測試專案,然後按一下 完成。
在方案總管] 中,連按兩下 [MyControl.xaml。
以滑鼠右鍵按一下按一下我! 按鈕,然後再按 刪除。
在 [工具] 視窗中嵌入控制項
將接下來,Windows Media Player 控制項加入至工具箱 ,然後將它加入至 [工具] 視窗。
將控制項內嵌在 [工具] 視窗
在工具箱,展開 所有的 WPF 控制項 一節,並尋找 媒體項目。
若要新增到您的工具視窗的媒體播放程式,請拖曳媒體項目 控制從 工具箱至 MyControl 表單。
在設計工具中,選取媒體項目控制項,然後檢查可用的屬性,在屬性視窗。 部分屬性是在所有的 Windows Form 控制項的標準。 不過,其他人提供控制項,例如, 來源,這用來在執行階段載入檔案。
在 [檔案] 功能表上,按一下 [全部儲存]。
將工具列新增到 [工具] 視窗
藉由新增工具列,以下列方式,您可以保證其漸層和色彩會與其餘的 IDE 一致。
若要將工具列新增到 [工具] 視窗
在方案總管] 中,開啟 FirstToolWin.vsct。 .Vsct 檔案會定義使用 XML 工具視窗中的圖形化使用者介面 (GUI) 項目。
在<Symbols>區段中,找出<GuidSymbol>節點其name屬性是guidFirstToolWinCmdSet。 加入下列這兩個<IDSymbol>的清單項目<IDSymbol>此節點定義工具列和工具列群組中的項目。
<IDSymbol name="ToolbarID" value="0x1000" /> <IDSymbol name="ToolbarGroupID" value="0x1001" />
以上只是<Groups>區段中,建立<Menus> 會與下列相似的區段:
<Menus> <Menu guid="guidFirstToolWinCmdSet" id="ToolbarID" priority="0x0000" type="ToolWindowToolbar"> <Parent guid="guidFirstToolWinCmdSet" 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>一節。
<Group guid="guidFirstToolWinCmdSet" id="ToolbarGroupID" priority="0x0000"> <Parent guid="guidFirstToolWinCmdSet" id="ToolbarID"/> </Group>
設父代的 guid 及識別碼的 guid 及識別碼的工具列,您可以將群組放在工具列上。
儲存檔案。
新增指令至工具列
接下來,將指令新增至工具列。 命令會顯示為按鈕和控制項中。
若要將指令新增到工具列
在 FirstToolWin.vsct,在<Symbols>區段中,宣告三個命令後的工具列和工具列群組宣告。
<IDSymbol name="cmdidWindowsMediaOpen" value="0x132" /> <IDSymbol name="cmdidWindowsMediaFilename" value="0x133" /> <IDSymbol name="cmdidWindowsMediaFilenameGetList" value="0x134" />
請注意,命令 cmdidWindowsMedia 和 cmdidWindowsMediaWin 已經宣告。
在<Buttons> ] 區段中, <Button>項目已經存在,而且它包含的 cmdidWindowsMedia 和 cmdidWindowsMediaWin 命令定義。 新增另一個<Button>項目以定義 [cmdidWindowsMediaOpen] 指令。
<Button guid="guidFirstToolWinCmdSet" id="cmdidWindowsMediaOpen" priority="0x0101" type="Button"> <Parent guid="guidFirstToolWinCmdSet" id="ToolbarGroupID"/> <Icon guid="guidImages" id="bmpPic1" /> <Strings> <CommandName>cmdidWindowsMediaOpen</CommandName> <ButtonText>Load File</ButtonText> </Strings> </Button>
請注意,第二個按鈕的優先順序是0x0101。 在下一個步驟是加入下拉式方塊具有更高優先順序0x0100。 因此,在下拉式方塊會出現在第一個位置,按鈕會出現在第二個位置。
若要提供位置,以讓使用者輸入一些文字,請新增一個組合方塊。 要加入下拉式方塊像新增一個按鈕,不同之處在於您可以定義下拉式方塊中的<Combos>一節。
建立<Combos>一節,之後只要</Buttons> ,有一個項目來定義下拉式方塊的標籤。
<Combos> <Combo guid="guidFirstToolWinCmdSet" id="cmdidWindowsMediaFilename" priority="0x0100" type="DynamicCombo" idCommandList="cmdidWindowsMediaFilenameGetList" defaultWidth="130"> <Parent guid="guidFirstToolWinCmdSet" id="ToolbarGroupID" /> <CommandFlag>IconAndText</CommandFlag> <CommandFlag>CommandWellOnly</CommandFlag> <CommandFlag>StretchHorizontally</CommandFlag> <Strings> <CommandName>Filename</CommandName> <ButtonText>Enter a Filename</ButtonText> </Strings> </Combo> </Combos>
儲存並關閉 FirstToolWin.vsct。
在方案總管] 中、 在 [專案] 資料夾中,開啟 PkgCmdID.cs 或 PkgCmdID.vb,然後在類別中加入下列行,只會在現有的成員之後。
Public Const cmdidWindowsMediaOpen As Integer = &H132 Public Const cmdidWindowsMediaFilename As Integer = &H133 Public Const cmdidWindowsMediaFilenameGetList As Integer = &H134 Public Const ToolbarID As Integer = &H1000
public const int cmdidWindowsMediaOpen = 0x132; public const int cmdidWindowsMediaFilename = 0x133; public const int cmdidWindowsMediaFilenameGetList = 0x134; public const int ToolbarID = 0x1000;
這麼做可讓您的命令可在程式碼中使用。
儲存並關閉檔案。
實作命令
現在撰寫實作命令的程式碼。
若要實作命令
在方案總管] 中,MyToolWindow.cs 或 MyToolWindow.vb,其中包含的類別本身的 [工具] 視窗開啟。
只在現有之後加入下列程式碼使用陳述式。
Imports System.ComponentModel.Design
using System.ComponentModel.Design;
這條線,可讓您使用CommandID而不需要完全地合格化的類別。
將下列程式碼加入至建構函式之前商行control = new MyControl() (C#) 或Me.Content = New MyControl() (VB)。
' Create the toolbar. Me.ToolBar = New CommandID(GuidList.guidFirstToolWinCmdSet, PkgCmdIDList.cmdidWindowsMediaWin) Me.ToolBarLocation = CInt(VSTWT_LOCATION.VSTWT_TOP) ' Create the handlers for the toolbar commands. Dim mcs As OleMenuCommandService = TryCast(GetService(GetType(IMenuCommandService)), OleMenuCommandService) If mcs IsNot Nothing Then Dim toolbarbtnCmdID As CommandID = New CommandID(GuidList.guidFirstToolWinCmdSet, PkgCmdIDList.cmdidMyCommand) Dim menuItem As MenuCommand = New MenuCommand(New EventHandler(AddressOf ButtonHandler), toolbarbtnCmdID) mcs.AddCommand(menuItem) ' Command for the combo itself Dim menuMyDynamicComboCommandID As CommandID = New CommandID(GuidList.guidFirstToolWinCmdSet, CInt(PkgCmdIDList.cmdidMyCommand)) Dim menuMyDynamicComboCommand As OleMenuCommand = New OleMenuCommand(New EventHandler(AddressOf ComboHandler), menuMyDynamicComboCommandID) mcs.AddCommand(menuMyDynamicComboCommand) ' Command for the combo's list Dim comboListCmdID As CommandID = New CommandID(GuidList.guidFirstToolWinCmdSet, PkgCmdIDList.cmdidWindowsMediaWin) Dim comboMenuList As OleMenuCommand = New OleMenuCommand(New EventHandler(AddressOf ComboListHandler), comboListCmdID) mcs.AddCommand(comboMenuList) End If
// Create the toolbar. this.ToolBar = new CommandID(GuidList.guidFirstToolWinCmdSet, PkgCmdIDList.ToolbarID); this.ToolBarLocation = (int)VSTWT_LOCATION.VSTWT_TOP; // Create the handlers for the toolbar commands. var mcs = GetService(typeof(IMenuCommandService)) as OleMenuCommandService; if (null != mcs) { var toolbarbtnCmdID = new CommandID( GuidList.guidFirstToolWinCmdSet, PkgCmdIDList.cmdidWindowsMediaOpen); var menuItem = new MenuCommand(new EventHandler( ButtonHandler), toolbarbtnCmdID); mcs.AddCommand(menuItem); // Command for the combo itself var menuMyDynamicComboCommandID = new CommandID( GuidList.guidFirstToolWinCmdSet, (int)PkgCmdIDList.cmdidWindowsMediaFilename); var menuMyDynamicComboCommand = new OleMenuCommand( new EventHandler(ComboHandler), menuMyDynamicComboCommandID); mcs.AddCommand(menuMyDynamicComboCommand); // Command for the combo's list var comboListCmdID = new CommandID( GuidList.guidFirstToolWinCmdSet, PkgCmdIDList.cmdidWindowsMediaFilenameGetList); var comboMenuList = new OleMenuCommand( new EventHandler(ComboListHandler), comboListCmdID); mcs.AddCommand(comboMenuList); }
這段程式碼加入三個命令,其中一個按鈕和兩個在組合方塊。 當使用者提出一個項目,以及一個用來填入下拉式選單,下拉式方塊會需要另一個則用於的兩個命令。
從工具列上的控制項的事件處理常式,您的程式碼必須能夠存取媒體播放程式控制項,也就是 MyControl 類別的子系。
在方案總管] 中,MyControl.xaml 上按一下滑鼠右鍵,再按 檢視程式碼,並將下列程式碼加入至 MyControl 類別。
Public ReadOnly Property MediaPlayer() As System.Windows.Controls.MediaElement Get Return MediaElement1 End Get End Property
public System.Windows.Controls.MediaElement MediaPlayer { get { return mediaElement1; } }
儲存檔案。
傳回 MyToolWindow.cs 或 MyToolWindow.vb,並將下列程式碼加入類別中前兩個的最後一個結尾大括號 (C#) 或 End Class 陳述式 (Visual Basic), 結尾。
Private Sub ButtonHandler(ByVal sender As Object, ByVal arguments As EventArgs) If comboValue IsNot Nothing AndAlso comboValue.Trim().Length <> 0 Then LoadFile(comboValue) End If End Sub Private Sub ComboHandler(ByVal sender As Object, ByVal arguments As EventArgs) Dim eventArgs As OleMenuCmdEventArgs = TryCast(arguments, OleMenuCmdEventArgs) If eventArgs IsNot Nothing Then Dim output As IntPtr = eventArgs.OutValue Dim input As Object = eventArgs.InValue If input IsNot Nothing Then comboValue = input.ToString() ElseIf output <> IntPtr.Zero Then Marshal.GetNativeVariantForObject(comboValue, output) End If End If End Sub Public Sub LoadFile(ByVal comboValue As String) control.MediaPlayer.Source = New Uri(comboValue) End Sub Private Sub ComboListHandler(ByVal sender As Object, ByVal arguments As EventArgs) End Sub
private void ButtonHandler(object sender, EventArgs arguments) { if (comboValue != null && comboValue.Trim().Length != 0) { LoadFile(comboValue); } } private void ComboHandler(object sender, EventArgs arguments) { var eventArgs = arguments as OleMenuCmdEventArgs; if (eventArgs != null) { IntPtr output = eventArgs.OutValue; object input = eventArgs.InValue; if (input != null) { comboValue = input.ToString(); } else if (output != IntPtr.Zero) { Marshal.GetNativeVariantForObject(comboValue, output); } } } public void LoadFile(string comboValue) { control.MediaPlayer.Source = new System.Uri(comboValue); } private void ComboListHandler(object sender, EventArgs arguments) { }
請注意,menuMyDynamicComboCommand 和功能表項目都共用相同的事件處理常式。 因此,[工具] 視窗可以播放下拉式方塊中所指定的檔案。 在這個逐步解說中,您不提供 ComboListHandler 函式的程式碼。 在下一個逐步解說中, 逐步解說: 擴充的工具視窗 (第 3 部,共 4),您將藉由使用播放清單名稱填入下拉式清單中的程式碼。
組合的處理常式會儲存為鍵入的內容貼入其中成員變數中。 若要新增該變數,請加入下列程式碼 (在 Visual Basic,Inherits 陳述式之後) 類別的頂端。 在此同時,加入成員變數來保存控制項。
Dim control As MyControl Dim comboValue As String
private MyControl control; string comboValue = "";
當按一下按鈕時,按鈕會讀取這個區域變數的值,並載入它媒體播放程式。
設定 [工具] 視窗的預設位置
接下來,指定的預設位置在 IDE 中工具視窗。 工具視窗的組態資訊不在 FirstToolWinPackage.cs 檔案中。
若要設定 [工具] 視窗的預設位置
在方案總管] 中,開啟 FirstToolWinPackage.cs 或 FirstToolWinPackage.vb。 在這個檔案中,找出ProvideToolWindowAttribute在FirstToolWinPackage類別。 這段程式碼將 MyToolWindow 型別傳遞至建構函式。 若要指定預設位置,您必須新增更多的參數,建構函式之後的範例。
<PackageRegistration(UseManagedResourcesOnly:=True), _ InstalledProductRegistration("#110", "#112", "1.0", IconResourceID:=400), _ ProvideMenuResource("Menus.ctmenu", 1), _ ProvideToolWindow(GetType(MyToolWindow), Style:=Microsoft.VisualStudio.Shell.VsDockStyle.Tabbed, Window:="3ae79031-e1bc-11d0-8f78-00a0c9110057"), _ Guid(GuidList.guidFirstToolWinPkgString)> _ Public NotInheritable Class FirstToolWinPackage Inherits Package
[ProvideToolWindow(typeof(MyToolWindow), Style = Microsoft.VisualStudio.Shell.VsDockStyle.Tabbed, Window = "3ae79031-e1bc-11d0-8f78-00a0c9110057")]
第一個具名的參數是樣式,然後定位它的值,表示視窗會在現有視窗中的索引標籤。 視窗會提供名為參數 ; 視窗 它的值是 GUID。 在此情況下,[GUID] 是一個用於方案總管] 中。
注意事項
如需有關 windows 在 IDE 中的 Guid 的詳細資訊,請參閱vsWindowKind 常數 MSDN 網站上。
儲存您的工作。
測試工具視窗
若要測試工具視窗
按下 F5,以開啟 Visual Studio 的實驗性的新執行個體建立時。
在檢視 功能表上指向 其他視窗 ,然後按一下 Windows Media Player。
媒體的播放程式] 工具視窗應該在相同的視窗,以開啟方案總管] 中。
在 [媒體播放機] 工具視窗中清單方塊中鍵入檔案的完整路徑和檔案名稱支援的聲音或視訊檔案,例如,C:\windows\media\chimes.wav,請按 Enter,然後按一下相鄰的按鈕。
注意事項
您必須在文字方塊中輸入檔案名稱,因為媒體的播放程式] 工具視窗並沒有開啟舊檔對話方塊。
下一步
在逐步解說: 擴充的工具視窗 (第 3 部,共 4),您可以學習到如何將更多控制項加入至 [工具] 視窗。 您可以新增按鈕,以顯示開啟舊檔對話方塊中,您可以用來選取要播放檔案的媒體播放程式。 這樣就可以選擇其中一個播放,也可以新增播放清單的下拉式清單。