How to: 建立功能表、 子功能表和快顯功能表
若要加入功能表 Visual Studio 的整合式的開發環境 (IDE) 時,必須使用的 VSPackage Visual Studio SDK的命令群組功能表結構。 命令-群組功能表可讓命令即可重複使用和共用的元件和環境。 如需有關命令群組功能表的詳細資訊,請參閱VSPackages 對 IDE 所新增的使用者介面項目。
功能表定義中的 VSPackages, 功能表 .vsct 檔的區段。 .Vsct 檔案會定義功能表和工具列],群組及指令。 命令是使用者按下執行的功能。 「 群組 」 是一個命令和功能表容器。 功能表是群組的容器。 因此,若要建立基本的功能表,您必須建立一個功能表、 命令群組,以及至少一個命令。
有三種基本方式功能表可能會出現在Visual Studio、,如下所示:
為主要功能表列上的功能表。
以另一個功能表的子功能表。
以快顯功能表 (通常是以滑鼠右鍵按一下顯示)。
本主題說明如何建立每一類型的功能表。 下列逐步解說也會示範如何執行這項操作:
若要建立功能表、 子功能表或快顯功能表
在專案中,連按兩下以開啟編輯器] 中的.vsct 檔案。
如果您的專案並沒有.vsct 檔案,新增一個。 如果您正在使用 Visual Studio 的封裝範本建立封裝,選取 [ 功能表命令。 如此一來,就會產生.vsct 檔。
在Symbols區段中,找出 GuidSymbol 所在的群組和命令的項目。
建立 IDSymbol ,如下列範例所示,您想要新增每個功能表、 群組或命令的項目。
<GuidSymbol name="guidButtonGroupCmdSet" value="{f69209e9-975a-4543-821d-1f4a2c52d737}"> <IDSymbol name="MyMenuGroup" value="0x1020" /> <IDSymbol name="cmdidMyCommand" value="0x0100" /> </GuidSymbol>
name屬性的GuidSymbol和IDSymbol元素提供 GUID:ID 對每個新的功能表、 群組或命令。 GUID代表一組係專為您 VSPackage 的命令。 您可以定義多個命令集。 每個 GUID:ID 配對必須是唯一的。
定義新的功能表,在Menus區段,如下所示:
設定guid和id欄位,以符合新的功能表的 GUID:ID。
設定 priority 屬性。
priority .vsct 會使用屬性來判斷父群組中其他物件之間功能表所在位置。
具有較低的優先順序值的功能表會顯示之前有較高的優先權值的功能表。 允許重複的優先順序值,但具有相同優先順序的功能表中的相對位置由 VSPackages 處理執行階段的順序,該順序無法預先決定。 省略priority屬性設定其值為 0。
不要設定為快顯功能表的優先權,因為它的位置由呼叫它的程式碼。
功能表和子功能表中,設定type屬性設定為功能表,何者說明典型的功能表。 對於快顯功能表中,設定type屬性設定為內容。
如需其他的有效功能表類型,如工具列和功能表控制器的說明,請參閱Menu 項目。
在功能表定義中,建立字串 區段包含了 藉 項目來包含功能表的名稱,在 IDE 中,所顯示的樣子和 CommandName 項目來包含用來存取功能表命令名稱命令視窗。
如果按鈕的文字字串包含 '&' 字元,使用者可以開啟功能表,按下 alt 鍵加上字元也會緊隨 「 & 」。
請將命令旗標,視需要來變更功能表的行為和外觀。 若要這樣做,請將 CommandFlag 在功能表定義中的項目。 如需詳細資訊,請參閱 CommandFlag 項目。
設定功能表的父代。 標準功能表或子功能表中,這樣做在下列的方式,取決於您的設計其中一項:
在Menu項目,建立父項目並設定其guid和id欄位,以將用來架設] 功能表中,也就是群組的 GUID:ID 主要父群組。 父群組可以是您在建立一組Symbols區段、 群組與另一個套件或來自於 IDE 的群組。 例如,若要在 IDE 的最上層的功能表列中加入您的功能表,附近工具 ] 功能表中,設定為 guidSHLMainMenu:IDG_VS_MM_TOOLSADDINS 的父代。
下列範例會顯示 Visual Studio 的功能表列上會出現一個功能表。
<Menu guid="guidTopLevelMenuCmdSet" id="TopLevelMenu" priority="0x700" type="Menu"> <Parent guid="guidSHLMainMenu" id="IDG_VS_MM_TOOLSADDINS" /> <Strings> <ButtonText>TestMenu</ButtonText> <CommandName>TestMenu</CommandName> </Strings> </Menu>
您可以省略Parent如果功能表是藉由使用命令位置置放的項目。 建立 CommandPlacements 之前章節Symbols區段,然後新增 CommandPlacement 有的功能表、 優先順序及父代,GUID:ID,如下列範例所示的項目。
<CommandPlacements> <CommandPlacement guid="guidButtonGroupCmdSet" id="cmdidMyCommand" priority="0x105"> <Parent guid="guidButtonGroupCmdSet" id="MyMenuGroup" /> </CommandPlacement> </CommandPlacements>
建立多個有相同的 GUID:ID 而有不同的父項的指令定位時,會造成功能表會出現在多個位置。 如需詳細資訊,請參閱 CommandPlacements 項目。
標準功能表必須有 Visual Studio 的功能表列上的群組,做為其父系。 子功能表,而父代必須是另一個功能表上的群組 (雖然在工具列或其他功能表型別,可能會在父功能表)。 功能表或 [顯示] 子功能表中,必須含有一組包含至少一個作用中的指令,或有AlwaysCreate命令旗標組。
快顯功能表沒有父代或命令的安置地方。 相反地,必須在程式碼中啟動。 一般來說,快顯功能表就會啟動以回應控制項介面上按一下滑鼠右鍵。 下列範例會定義一個快顯功能表。
<Menu guid="guidButtonGroupCmdSet" id="ShortcutMenu" type="Context"> <Strings> <ButtonText>Shortcut Menu</ButtonText> <CommandName>ShortcutMenu</CommandName> </Strings> </Menu>
在群組 區段中,建立 群組項目來包含要顯示在您的功能表上的命令。 Symbols區段中必須包含一個具有相同的 GUID:ID 為新的項目Group項目。
設定優先順序的群組,使其將會出現在功能表上您要的位置。
功能表中的每個群組的邊界會顯示為水平規線。
父代這個新群組設定為 GUID:ID 所建立的功能表。 執行這項操作時,會將指令群組放在功能表上。
如下例所示的群組會出現在 [最上層的功能表,先前的範例所示。
<Group guid="guidTopLevelMenuCmdSet" id="MyMenuGroup" priority="0x0600"> <Parent guid="guidTopLevelMenuCmdSet" id="TopLevelMenu"/> </Group>
將最上層的功能表中的群組中的下列範例所示的功能表,就會比較子功能表。
<Menu guid="guidTopLevelMenuCmdSet" id="SubMenu" priority="0x0100" type="Menu"> <Parent guid="guidTopLevelMenuCmdSet" id="MyMenuGroup"/> <Strings> <ButtonText>Sub Menu</ButtonText> <CommandName>Sub Menu</CommandName> </Strings> </Menu>
將指令新增至] 功能表中,藉由建立命令中的項目按鈕一節,並設定每個群組的 GUID:ID 的父代。 每個按鈕項目必須具有對應中的項目到 GUID:ID Symbols一節。
使用priority屬性來指定群組中的指令出現的順序每個按鈕項目。
下列範例會定義最上層功能表會出現的命令。
<Button guid="guidTopLevelMenuCmdSet" id="cmdidTestCommand" priority="0x0100" type="Button"> <Parent guid="guidTopLevelMenuCmdSet" id="MyMenuGroup" /> <Icon guid="guidImages" id="bmpPic1" /> <Strings> <CommandName>cmdidTestCommand</CommandName> <ButtonText>Test Command</ButtonText> </Strings> </Button>
如需有關按鈕和功能表項目的詳細資訊,請參閱Button 項目。
如需如何實作在程式碼中的功能表命令的資訊,請參閱How to: 建立和處理命令,在 VSPackages (C#)或本主題稍早所述的逐步解說。
若要啟動的快顯功能表
取得快顯功能表的 GUID:ID。 根據預設,[套件] 範本會建立GuidList來存放的指令集的 GUID 的 PkgCmdID.cs 檔案中的類別。 範本也會建立PkgCmdIdList PkgCmdId.cs 檔,來存放整數的範本中所宣告的命令 ID 值中的類別。 完成範本之後,必須宣告快顯功能表和任何其他的命令。 下列範例會顯示這些宣告。
static class PkgCmdIDList { public const uint cmdidColorChange = 0x101; public const int ColorMenu = 0x1000; public const int cmdidRed = 0x102; public const int cmdidYellow = 0x103; public const int cmdidBlue = 0x104; };
如果要直接使用的 GUID 及識別碼的值,則可以省略此步驟。 不過,我們建議您設定的值在這裡,為了方便讀者閱讀。
將附加至事件處理常式。 通常會將快顯功能表貼附的控制項的介面中,按一下滑鼠右鍵,如下列範例所示。
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); } }
PointToScreen方法會將按一下的位置,也就是相對於控制項,轉換到螢幕的位置。 ShowContextMenu方法會顯示快顯功能表。
包含事件處理常式的檔案必須包含System.ComponentModel.Design命名空間,以存取OleMenuCommandService類別,以及Microsoft.VisualStudio.Shell來存取命名空間IMenuCommandService介面。
using Microsoft.VisualStudio.Shell; using System.ComponentModel.Design;
請參閱
工作
How to: 建立和處理命令,在 VSPackages (C#)