將功能表控制器新增至工具列
本逐步解說是以將工具列新增至工具視窗逐步解說為基礎,並說明如何將功能表控制器新增至工具視窗工具列。 此處顯示的步驟也可以套用至在新增工具列逐步解說中建立的工具列。
功能表控制器是分割控制項。 功能表控制器的左側會顯示最後一個使用的命令,您可以按下它來執行它。 功能表控制器的右側是一個箭號,當按下時,會開啟其他命令的清單。 當您按一下清單上的命令時,命令會執行,並取代功能表控制器左側的命令。 如此一來,功能表控制器的運作方式就像始終顯示清單中最後一個使用命令的命令按鈕一樣。
功能表控制器可以顯示在功能表上,但它們最常用於工具列上。
建立功能表控制器
遵循將工具列新增至工具視窗中所述的程序,來建立具有工具列的工具視窗。
在 TWTestCommandPackage.vsct 中,移至 [符號] 區段。 在名為 guidTWTestCommandPackageCmdSet 的 GuidSymbol 元素中,宣告您的功能表控制器、功能表控制器群組和三個功能表項目。
<IDSymbol name="TestMenuController" value="0x1300" /><IDSymbol name="TestMenuControllerGroup" value="0x1060" /><IDSymbol name="cmdidMCItem1" value="0x0130" /><IDSymbol name="cmdidMCItem2" value="0x0131" /><IDSymbol name="cmdidMCItem3" value="0x0132" />
在 [功能表] 區段中的最後一個功能表項之後,將功能表控制器定義為功能表。
<Menu guid="guidTWTestCommandPackageCmdSet" id="TestMenuController" priority="0x0100" type="MenuController"> <Parent guid="guidTWTestCommandPackageCmdSet" id="TWToolbarGroup" /> <CommandFlag>IconAndText</CommandFlag> <CommandFlag>TextChanges</CommandFlag> <CommandFlag>TextIsAnchorCommand</CommandFlag> <Strings> <ButtonText>Test Menu Controller</ButtonText> <CommandName>Test Menu Controller</CommandName> </Strings> </Menu>
必須包含
TextChanges
和TextIsAnchorCommand
旗標,功能表控制器才能反映最後一個選取的命令。在 [群組] 區段中的最後一個群組項目之後,新增功能表控制器群組。
<Group guid="guidTWTestCommandPackageCmdSet" id="TestMenuControllerGroup" priority="0x000"> <Parent guid="guidTWTestCommandPackageCmdSet" id="TestMenuController" /> </Group>
藉由將功能表控制器設定為父系,放入此群組中的任何命令都會出現在功能表控制器中。
priority
屬性會省略,這會將它設定為預設值 0,因為它是功能表控制器上唯一的群組。在 [按鈕] 區段中的最後一個按鈕項目之後,為每個功能表項目新增 Button 元素。
<Button guid="guidTWTestCommandPackageCmdSet" id="cmdidMCItem1" priority="0x0000" type="Button"> <Parent guid="guidTWTestCommandPackageCmdSet" id="TestMenuControllerGroup" /> <Icon guid="guidImages" id="bmpPic1" /> <CommandFlag>IconAndText</CommandFlag> <Strings> <ButtonText>MC Item 1</ButtonText> <CommandName>MC Item 1</CommandName> </Strings> </Button> <Button guid="guidTWTestCommandPackageCmdSet" id="cmdidMCItem2" priority="0x0100" type="Button"> <Parent guid="guidTWTestCommandPackageCmdSet" id="TestMenuControllerGroup" /> <Icon guid="guidImages" id="bmpPic2" /> <CommandFlag>IconAndText</CommandFlag> <Strings> <ButtonText>MC Item 2</ButtonText> <CommandName>MC Item 2</CommandName> </Strings> </Button> <Button guid="guidTWTestCommandPackageCmdSet" id="cmdidMCItem3" priority="0x0200" type="Button"> <Parent guid="guidTWTestCommandPackageCmdSet" id="TestMenuControllerGroup" /> <Icon guid="guidImages" id="bmpPicSearch" /> <CommandFlag>IconAndText</CommandFlag> <Strings> <ButtonText>MC Item 3</ButtonText> <CommandName>MC Item 3</CommandName> </Strings> </Button>
此時,您可以查看功能表控制器。 建置此專案並開始偵錯。 您應該會看到實驗執行個體。
在 [檢視 / 其他視窗] 功能表上,開啟 [測試 ToolWindow]。
功能表控制器會出現在工具視窗中的工具列上。
按一下功能表控制器右側的箭號,以查看三個可能的命令。
請注意,當您按下命令時,功能表控制器的標題會變更為顯示該命令。 在下一個部分,我們將新增程式碼以啟動這些命令。
實作功能表控制器命令
在 TWTestCommandPackageGuids.cs中,在現有的命令識別碼之後新增三個功能表項目的命令識別碼。
public const int cmdidMCItem1 = 0x130; public const int cmdidMCItem2 = 0x131; public const int cmdidMCItem3 = 0x132;
在 TWTestCommand.cs 中的
TWTestCommand
類別頂端新增下列程式碼。private int currentMCCommand; // The currently selected menu controller command
在 TWTestCommand 建構函式中,於最後一次呼叫
AddCommand
方法之後新增程式碼,以透過相同的處理常式路由傳送每個命令的事件。for (int i = TWTestCommandPackageGuids.cmdidMCItem1; i <= TWTestCommandPackageGuids.cmdidMCItem3; i++) { CommandID cmdID = new CommandID(new Guid(TWTestCommandPackageGuids.guidTWTestCommandPackageCmdSet), i); OleMenuCommand mc = new OleMenuCommand(new EventHandler(OnMCItemClicked), cmdID); mc.BeforeQueryStatus += new EventHandler(OnMCItemQueryStatus); commandService.AddCommand(mc); // The first item is, by default, checked. if (TWTestCommandPackageGuids.cmdidMCItem1 == i) { mc.Checked = true; this.currentMCCommand = i; } }
將事件處理常式新增至 TWTestCommand 類別,將選取的命令標示為已核取。
private void OnMCItemQueryStatus(object sender, EventArgs e) { OleMenuCommand mc = sender as OleMenuCommand; if (null != mc) { mc.Checked = (mc.CommandID.ID == this.currentMCCommand); } }
新增事件處理常式,在使用者選取功能表控制器上的命令時顯示 MessageBox:
private void OnMCItemClicked(object sender, EventArgs e) { OleMenuCommand mc = sender as OleMenuCommand; if (null != mc) { string selection; switch (mc.CommandID.ID) { case c.cmdidMCItem1: selection = "Menu controller Item 1"; break; case TWTestCommandPackageGuids.cmdidMCItem2: selection = "Menu controller Item 2"; break; case TWTestCommandPackageGuids.cmdidMCItem3: selection = "Menu controller Item 3"; break; default: selection = "Unknown command"; break; } this.currentMCCommand = mc.CommandID.ID; IVsUIShell uiShell = (IVsUIShell) ServiceProvider.GetService(typeof(SVsUIShell)); Guid clsid = Guid.Empty; int result; uiShell.ShowMessageBox( 0, ref clsid, "Test Tool Window Toolbar Package", string.Format(CultureInfo.CurrentCulture, "You selected {0}", selection), string.Empty, 0, OLEMSGBUTTON.OLEMSGBUTTON_OK, OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST, OLEMSGICON.OLEMSGICON_INFO, 0, out result); } }
測試功能表控制器
建置此專案並開始偵錯。 您應該會看到實驗執行個體。
開啟 [檢視 / 其他視窗] 功能表上的 [測試 ToolWindow]。
功能表控制器會出現在工具視窗中的工具列中,並顯示 MC 項目 1。
按一下箭號左邊的功能表控制器按鈕。
您應該會看到三個項目,其中第一個已選取,且其圖示周圍有醒目提示方塊。 按一下 [MC 項目 3]。
隨即會出現一個對話方塊,其中包含「您已選取功能表控制器項目案 3」訊息。 請注意,訊息會對應至功能表控制器按鈕上的文字。 功能表控制器按鈕現在會顯示「MC 項目 3」。