逐步解說: 實作工具視窗中的快顯功能表
本逐步解說會置於工具視窗中的快顯功能表。 快顯功能表是在使用者按一下滑鼠右鍵的圖形化使用者介面 (GUI) 項目,例如按鈕、 文字方塊或視窗背景時,就會出現一個功能表。 快顯功能表上的命令的行為與其他功能表或工具列上的命令相同。 若要支援的快顯功能表,則在 XML 命令表裡 (.vsct) 檔案中指定並顯示於回應按一下滑鼠右鍵。
工具視窗所組成的自訂工具視窗類別繼承自 Windows Presentation Foundation (WPF) 使用者控制項ToolWindowPane。
這個逐步解說會示範如何建立快顯功能表為 Visual Studio 的功能表中,宣告在.vsct 檔案中,功能表項目,然後使用管理套件架構來實作類別,定義 [工具] 視窗中。 這種方式幫助您 Visual Studio 的命令、 UI 項目及自動化的物件模型存取權。
或者,如果您的快顯功能表將不會存取 Visual Studio 的功能,您可以使用ContextMenu的使用者控制項中的 XAML 元素的屬性。 如需詳細資訊,請參閱 ContextMenu。
必要條件
若要完成這個逐步解說中,您必須安裝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 + +。
建立工具視窗快顯功能表套件
若要建立 MyTWGradientPackage VSPackage
建立名為 Visual Studio 的封裝專案 TWShortcutMenu。
在套件精靈] 中,設定語言 Visual Basic 或 C#。
選取 [建立工具視窗。
命名色彩變更] 視窗中的 [工具] 視窗,並設定它的命令 ID 為 cmdidColorChange。
指定快顯功能表
如所示,在這個逐步解說可讓使用者的快顯功能表選取 [從一份用來填滿工具視窗背景的色彩。
若要建立捷徑功能表
開啟 [MyTWGradientPackage.vsct]。
在的符號 項目,請在 GuidSymbol 名為"guidTWShortcutMenuCmdSet",項目可宣告快顯功能表、 快顯功能表群組和功能表選項,如下所示。
<IDSymbol name="ColorMenu" value="0x1000"/> <IDSymbol name="ColorGroup" value="0x1100"/> <IDSymbol name="cmdidRed" value="0x102"/> <IDSymbol name="cmdidYellow" value="0x103"/> <IDSymbol name="cmdidBlue" value="0x104"/>
之前群組 項目,建立 功能表項目,然後定義中的 [快顯功能表。
<Menus> <Menu guid="guidTWShortcutMenuCmdSet" id="ColorMenu" type="Context"> <Strings> <ButtonText>Color change</ButtonText> <CommandName>ColorChange</CommandName> </Strings> </Menu> </Menus>
快顯功能表沒有父代,因為它不是組件的功能表或工具列。
在Groups項目,定義群組包含快顯功能表項目,且與快顯功能表中的群組項目。
<Group guid="guidTWShortcutMenuCmdSet" id="ColorGroup"> <Parent guid="guidTWShortcutMenuCmdSet" id="ColorMenu"/> </Group>
在按鈕項目,定義個別的命令,就會出現快顯功能表上。
<Button guid="guidTWShortcutMenuCmdSet" id="cmdidRed" priority="1" type="Button"> <Parent guid="guidTWShortcutMenuCmdSet" id="ColorGroup" /> <Strings> <ButtonText>Red</ButtonText> </Strings> </Button> <Button guid="guidTWShortcutMenuCmdSet" id="cmdidYellow" priority="3" type="Button"> <Parent guid="guidTWShortcutMenuCmdSet" id="ColorGroup" /> <Strings> <ButtonText>Yellow</ButtonText> </Strings> </Button> <Button guid="guidTWShortcutMenuCmdSet" id="cmdidBlue" priority="5" type="Button"> <Parent guid="guidTWShortcutMenuCmdSet" id="ColorGroup" /> <Strings> <ButtonText>Blue</ButtonText> </Strings> </Button>
開啟 PkgCmdID.vb 或 PkgCmdID.cs。
新增快顯功能表和功能表項目定義。
public const int ColorMenu = 0x1000; public const int cmdidRed = 0x102; public const int cmdidYellow = 0x103; public const int cmdidBlue = 0x104;
這些都是相同的命令 Id 中所定義的Symbols TWShortcutMenu.vsct 檔的區段。 內容群組不包括此處因為它只需要在.vsct 檔案中。
儲存並建置方案。
實作快顯功能表
在快顯功能表和它的命令,則會實作這一節。
若要實作快顯功能表
開啟 MyToolWindow.vb 或 MyToolWindow.cs。
MyToolWindow類別有存取功能表命令的服務,但使用者可以控制它的主機並不會。 接下來的三個步驟將示範如何讓功能表命令服務的執行個體可以從 [工具] 視窗加入使用者控制項。
加入 System.ComponentModel.Design 命名空間
using System.ComponentModel.Design;
新增為用於儲存功能表命令服務的執行個體變數。
internal OleMenuCommandService mcs;
建構函式結尾處加入功能表命令服務呼叫和修改呼叫base.Content、,如下所示。
mcs = GetService(typeof(IMenuCommandService)) as OleMenuCommandService; base.Content = new MyControl(this);
呼叫建構函式中的功能表命令服務,可確保它是在記憶體中,開啟 [工具] 視窗時。 將工具視窗的執行個體當做參數傳遞給控制項的建構函式,可讓控制項的工具視窗類別成員的呼叫。
開啟 [MyControl.xaml]。
這個檔案表示會顯示在 [工具] 視窗中的使用者控制項。
新增MouseRightButtonDown上一層的事件UserControl項目。
MouseRightButtonDown="MyToolWindow_MouseRightButtonDown"
以滑鼠右鍵按一下您剛加入的事件宣告,然後按一下 [ 巡覽至事件處理常式。
這會開啟 MyControl.xaml.vb 或 MyControl.xaml.cs,並建立事件處理常式是 stub。
在 MyControl 頂端,加入Microsoft.VisualStudio.Shell和System.ComponentModel.Design命名空間。
using Microsoft.VisualStudio.Shell; using System.ComponentModel.Design;
加入欄位,以保存至父] 工具視窗中,並修改建構函式,如下所示。
MyToolWindow _parent; public MyControl(MyToolWindow parent) { InitializeComponent(); _parent = parent; OleMenuCommandService mcs = this._parent.mcs; if (null != mcs) { // Create an alias for the command set guid. Guid g = GuidList.guidTWShortcutMenuCmdSet; // Create the command IDs. var red = new CommandID(g, PkgCmdIDList.cmdidRed); var yellow = new CommandID(g, PkgCmdIDList.cmdidYellow); var blue = new CommandID(g, PkgCmdIDList.cmdidBlue); // Add a command for each command ID. mcs.AddCommand(new MenuCommand(ChangeColor, red)); mcs.AddCommand(new MenuCommand(ChangeColor, yellow)); mcs.AddCommand(new MenuCommand(ChangeColor, blue)); } }
建構函式現在會採用父工具視窗執行個體,做為參數,並將之儲存在_parent欄位。 然後會建立CommandID命令物件設定的 GUID 及PkgCmdList值,表示您在.vsct 檔案中定義的功能表指令。 最後,它會將命令加入功能表命令服務,然後將指派事件處理常式。
實作MyToolWindowMouseRightButtonDown ,如下所示的事件。
private void MyToolWindow_MouseRightButtonDown(object sender, MouseButtonEventArgs e) { OleMenuCommandService mcs = this._parent.mcs; if (null != mcs) { CommandID menuID = new CommandID( GuidList.guidTWShortcutMenuCmdSet, PkgCmdIDList.ColorMenu); Point p = this.PointToScreen(e.GetPosition(this)); mcs.ShowContextMenu(menuID, (int)p.X, (int)p.Y); } }
這會建立CommandID快速鍵功能表中的物件識別的位置按一下滑鼠,並在該位置開啟快顯功能表,使用ShowContextMenu方法。
實作事件,所定義的建構函式,使用者按一下功能表項目。
private void ChangeColor(object sender, EventArgs e ) { var mc = sender as MenuCommand; switch (mc.CommandID.ID) { case PkgCmdIDList.cmdidRed: MyToolWindow.Background = Brushes.Red; break; case PkgCmdIDList.cmdidYellow: MyToolWindow.Background = Brushes.Yellow; break; case PkgCmdIDList.cmdidBlue: MyToolWindow.Background = Brushes.Blue; break; } }
在此情況下,只是一種方法會處理所有功能表項目事件藉由識別CommandID ,並依此設定的背景色彩。 如果功能表項目所包含的不相關的命令,您會建立每個命令的個別事件處理常式。
測試工具視窗的功能
本章節示範如何示範在這個逐步解說已新增的功能。
若要測試工具視窗的功能
按 F5 以開啟實驗性的執行個體的Visual Studio。
在實驗性質的例子中,在檢視 ] 功能表中,按一下 其他視窗 ,然後按一下 色彩變更期間。 如此一來應該會顯示工具視窗。
以滑鼠右鍵按一下 [工具] 視窗的背景,離按鈕。 應該顯示快顯功能表具有色彩清單。
按一下快顯功能表上的色彩。 快顯功能表應該會消失,而且工具視窗的背景色彩應該變更為選取的色彩。
後續步驟
如果您可以修改.vsct 檔案,以變更快顯功能表,您必須重建 MyTWGradientPackageUI 專案。 如此一來,會強制.vsct 檔案時重新編譯,附屬 DLL 是 re-linked,您對.vsct 檔案所做的變更。