將子功能表新增至功能表
本逐步解說是以將功能表新增至 Visual Studio 功能表列中的示範為基礎,說明如何將子功能表新增至 TestMenu 功能表。
子功能表是出現在另一個功能表中的次要功能表。 子功能表可由其名稱後面的箭號來識別。 按一下該名稱便可顯示子功能及其命令。
本逐步解說會在 Visual Studio 功能表列的功能表中建立子功能表,並在子功能表上放置新命令。 本逐步解說也會實作新命令。
將子功能表新增至功能表
遵循將功能表新增至 Visual Studio 功能表列中的步驟,來建立專案和功能表項目。 本逐步解說中的步驟假設 VSIX 專案名稱為
TopLevelMenu
。開啟 TestCommandPackage.vsct。 在
<Symbols>
區段中,為子功能表新增<IDSymbol>
元素,一個用於子功能表群組,一個用於命令,全都位於名為 "guidTopLevelMenuCmdSet" 的<GuidSymbol>
節點中。這是包含最上層功能表<IDSymbol>
元素的相同節點。<IDSymbol name="SubMenu" value="0x1100"/> <IDSymbol name="SubMenuGroup" value="0x1150"/> <IDSymbol name="cmdidTestSubCommand" value="0x0105"/>
將新建立的子功能表新增至
<Menus>
區段。<Menu guid="guidTestCommandPackageCmdSet" id="SubMenu" priority="0x0100" type="Menu"> <Parent guid="guidTestCommandPackageCmdSet" id="MyMenuGroup"/> <Strings> <ButtonText>Sub Menu</ButtonText> <CommandName>Sub Menu</CommandName> </Strings> </Menu>
父系的 GUID/ID 配對會指定在將功能表新增至 Visual Studio 功能表列 中產生的功能表群組,而且是最上層功能表的子系。
將步驟 2 中定義的功能表群組新增至
<Groups>
區段,使其成為子功能表的子系。<Group guid="guidTestCommandPackageCmdSet" id="SubMenuGroup" priority="0x0000"> <Parent guid="guidTestCommandPackageCmdSet" id="SubMenu"/> </Group>
將新的
<Button>
元素新增至<Buttons>
區段,將步驟 2 中建立的命令定義為子功能表上的項目。<Button guid="guidTestCommandPackageCmdSet" id="cmdidTestSubCommand" priority="0x0000" type="Button"> <Parent guid="guidTestCommandPackageCmdSet" id="SubMenuGroup" /> <Icon guid="guidImages" id="bmpPic2" /> <Strings> <CommandName>cmdidTestSubCommand</CommandName> <ButtonText>Test Sub Command</ButtonText> </Strings> </Button>
組建方案並開始偵錯。 您應該會看到實驗執行個體。
按一下 [TestMenu] 以查看名為「子功能表」的新子功能表。 按一下 [子功能表] 以開啟子功能表,並查看新命令,即 [測試子命令]。 請注意,按一下 [測試子命令] 不會執行任何動作。
新增命令
開啟 TestCommand.cs,並在現有的命令識別碼之後新增下列命令識別碼。
public const int cmdidTestSubCmd = 0x0105;
新增子命令。 尋找命令建構函式。 在對
AddCommand
方法的呼叫後方新增下列程式碼。CommandID subCommandID = new CommandID(CommandSet, cmdidTestSubCmd); MenuCommand subItem = new MenuCommand(new EventHandler(SubItemCallback), subCommandID); commandService.AddCommand(subItem);
稍後會定義
SubItemCallback
命令處理常式。 建構函式看起來應該像這樣:private TestCommand(Package package) { if (package == null) { throw new ArgumentNullException("package"); } this.package = package; OleMenuCommandService commandService = this.ServiceProvider.GetService(typeof(IMenuCommandService)) as OleMenuCommandService; if (commandService != null) { var menuCommandID = new CommandID(CommandSet, CommandId); var menuItem = new MenuCommand(this.MenuItemCallback, menuCommandID); commandService.AddCommand(menuItem); CommandID subCommandID = new CommandID(CommandSet, cmdidTestSubCmd); MenuCommand subItem = new MenuCommand(new EventHandler(SubItemCallback), subCommandID); commandService.AddCommand(subItem); } }
加入
SubItemCallback()
。 這是按下子功能表中的新命令時所呼叫的方法。private void SubItemCallback(object sender, EventArgs e) { ThreadHelper.ThrowIfNotOnUIThread(); IVsUIShell uiShell = this.package.GetService<SVsUIShell, IVsUIShell>(); Guid clsid = Guid.Empty; int result; uiShell.ShowMessageBox( 0, ref clsid, "TestCommand", string.Format(CultureInfo.CurrentCulture, "Inside TestCommand.SubItemCallback()", this.ToString()), string.Empty, 0, OLEMSGBUTTON.OLEMSGBUTTON_OK, OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST, OLEMSGICON.OLEMSGICON_INFO, 0, out result); }
建置此專案並開始偵錯。 應該會出現實驗執行個體。
在 [TestMenu] 功能表上,按一下 [子功能表],然後按一下 [測試子命令]。 應該會出現訊息方塊並顯示文字:「測試命令位於 TestCommand.SubItemCallback() 內」。