Hinzufügen eines Menücontrollers zu einer Symbolleiste
Diese exemplarische Vorgehensweise basiert auf der exemplarischen Vorgehensweise zum Hinzufügen einer Symbolleiste zu einem Toolfenster und zeigt, wie Sie der Symbolleiste des Toolfensters einen Menücontroller hinzufügen. Die hier gezeigten Schritte können auch auf die Symbolleiste angewendet werden, die in der exemplarischen Vorgehensweise zum Hinzufügen einer Symbolleiste erstellt wird.
Ein Menücontroller ist ein geteiltes Steuerelement. Auf der linken Seite des Menücontrollers wird der zuletzt verwendete Befehl angezeigt, und Sie können ihn ausführen, indem Sie darauf klicken. Die rechte Seite des Menücontrollers ist ein Pfeil, mit dem beim Klicken eine Liste mit zusätzlichen Befehlen geöffnet wird. Wenn Sie auf einen Befehl in der Liste klicken, wird der Befehl ausgeführt, und er ersetzt den Befehl auf der linken Seite des Menücontrollers. Auf diese Weise funktioniert der Menücontroller wie eine Befehlsschaltfläche, die immer den zuletzt verwendeten Befehl aus einer Liste anzeigt.
Menücontroller können in Menüs angezeigt werden, werden jedoch am häufigsten auf Symbolleisten verwendet.
Erstellen eines Menücontrollers
Führen Sie die unter " Hinzufügen einer Symbolleiste zu einem Toolfenster" beschriebenen Verfahren aus, um ein Toolfenster mit einer Symbolleiste zu erstellen.
Wechseln Sie in TWTestCommandPackage.vsct zum Abschnitt "Symbole". Deklarieren Sie im GuidSymbol-Element " guidTWTestCommandPackageCmdSet" den Menücontroller, die Menücontrollergruppe und drei Menüelemente.
<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" />
Definieren Sie im Abschnitt "Menüs" nach dem letzten Menüeintrag den Menücontroller als Menü.
<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>
Die
TextChanges
KennzeichnungenTextIsAnchorCommand
müssen enthalten sein, damit der Menücontroller den letzten ausgewählten Befehl widerspiegelt.Fügen Sie im Abschnitt "Gruppen" nach dem letzten Gruppeneintrag die Menücontrollergruppe hinzu.
<Group guid="guidTWTestCommandPackageCmdSet" id="TestMenuControllerGroup" priority="0x000"> <Parent guid="guidTWTestCommandPackageCmdSet" id="TestMenuController" /> </Group>
Durch Festlegen des Menücontrollers als übergeordnetes Element werden alle Befehle in dieser Gruppe im Menücontroller angezeigt. Das
priority
Attribut wird weggelassen, wodurch es auf den Standardwert 0 festgelegt wird, da es sich um die einzige Gruppe auf dem Menücontroller handelt.Fügen Sie im Abschnitt "Schaltflächen" nach dem letzten Schaltflächeneintrag ein Button-Element für jedes Ihrer Menüelemente hinzu.
<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>
An diesem Punkt können Sie sich den Menücontroller ansehen. Erstellen Sie das Projekt, und starten Sie das Debugging. Die experimentelle Instanz sollte angezeigt werden.
Öffnen Sie im Menü "Ansicht/ Andere Windows" das Menü "TesttoolWindow".
Der Menücontroller wird auf der Symbolleiste im Toolfenster angezeigt.
Klicken Sie auf den Pfeil auf der rechten Seite des Menücontrollers, um die drei möglichen Befehle anzuzeigen.
Beachten Sie, dass beim Klicken auf einen Befehl der Titel des Menücontrollers geändert wird, um diesen Befehl anzuzeigen. Im nächsten Abschnitt fügen wir den Code hinzu, um diese Befehle zu aktivieren.
Implementieren der Menücontrollerbefehle
Fügen Sie in TWTestCommandPackageGuids.cs Befehls-IDs für ihre drei Menüelemente nach den vorhandenen Befehls-IDs hinzu.
public const int cmdidMCItem1 = 0x130; public const int cmdidMCItem2 = 0x131; public const int cmdidMCItem3 = 0x132;
Fügen Sie in TWTestCommand.cs oben in der
TWTestCommand
Klasse den folgenden Code hinzu.private int currentMCCommand; // The currently selected menu controller command
Fügen Sie im TWTestCommand-Konstruktor nach dem letzten Aufruf der
AddCommand
Methode Code hinzu, um die Ereignisse für jeden Befehl über dieselben Handler weiterzuleiten.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; } }
Fügen Sie der TWTestCommand-Klasse einen Ereignishandler hinzu, um den ausgewählten Befehl als aktiviert zu markieren.
private void OnMCItemQueryStatus(object sender, EventArgs e) { OleMenuCommand mc = sender as OleMenuCommand; if (null != mc) { mc.Checked = (mc.CommandID.ID == this.currentMCCommand); } }
Fügen Sie einen Ereignishandler hinzu, der ein MessageBox-Objekt anzeigt, wenn der Benutzer einen Befehl auf dem Menücontroller auswählt:
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); } }
Testen des Menücontrollers
Erstellen Sie das Projekt, und starten Sie das Debugging. Die experimentelle Instanz sollte angezeigt werden.
Öffnen Sie das TesttoolWindow im Menü "Ansicht/ Andere Windows" .
Der Menücontroller wird in der Symbolleiste im Toolfenster angezeigt und zeigt MC Item 1 an.
Klicken Sie links neben dem Pfeil auf die Menücontrollerschaltfläche.
Es sollten drei Elemente angezeigt werden, deren erstes ausgewählt ist und ein Hervorhebungsfeld um das Symbol herum vorhanden ist. Klicken Sie auf MC Element 3.
Ein Dialogfeld wird mit der Meldung " Menücontrollerelement 3" angezeigt. Beachten Sie, dass die Nachricht dem Text auf der Menücontrollerschaltfläche entspricht. Die Menücontrollerschaltfläche zeigt jetzt MC Item 3 an.