Agregar un controlador de menú a una barra de herramientas
Este tutorial se basa en el tutorial Agregar una barra de herramientas a una ventana de herramientas y muestra cómo agregar un controlador de menú a la barra de herramientas de la ventana de herramientas. Los pasos que se muestran aquí también se pueden aplicar a la barra de herramientas que se crea en el tutorial Agregar una barra de herramientas .
Un controlador de menú es un control dividido. El lado izquierdo del controlador de menú muestra el comando usado por última vez y puede ejecutarlo haciendo clic en él. El lado derecho del controlador de menús es una flecha que, cuando se hace clic, abre una lista de comandos adicionales. Al hacer clic en un comando de la lista, el comando se ejecuta y reemplaza el comando en el lado izquierdo del controlador de menús. De este modo, el controlador de menú funciona como un botón de comando que siempre muestra el último comando usado de una lista.
Los controladores de menú pueden aparecer en los menús, pero se usan con más frecuencia en las barras de herramientas.
Crear un controlador de menú
Siga los procedimientos descritos en Agregar una barra de herramientas a una ventana de herramientas para crear una ventana de herramientas que tenga una barra de herramientas.
En TWTestCommandPackage.vsct, vaya a la sección Símbolos. En el elemento GuidSymbol denominado guidTWTestCommandPackageCmdSet, declare el controlador de menú, el grupo de controladores de menú y tres elementos de menú.
<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" />
En la sección Menús, después de la última entrada de menú, defina el controlador de menús como un 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>
Las
TextChanges
marcas yTextIsAnchorCommand
deben incluirse para permitir que el controlador de menú refleje el último comando seleccionado.En la sección Grupos, después de la última entrada de grupo, agregue el grupo de controladores de menús.
<Group guid="guidTWTestCommandPackageCmdSet" id="TestMenuControllerGroup" priority="0x000"> <Parent guid="guidTWTestCommandPackageCmdSet" id="TestMenuController" /> </Group>
Al establecer el controlador de menú como primario, los comandos colocados en este grupo aparecen en el controlador de menús. El
priority
atributo se omite, que lo establece en el valor predeterminado de 0, ya que es el único grupo del controlador de menús.En la sección Botones, después de la última entrada del botón, agregue un elemento Button para cada uno de los elementos de menú.
<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>
En este punto, puede ver el controlador de menú. Compile la solución y comience la depuración. Debería ver la instancia experimental.
En el menú Ver u otras ventanas , abra Herramienta de pruebaWindow.
El controlador de menú aparece en la barra de herramientas de la ventana de herramientas.
Haga clic en la flecha situada en el lado derecho del controlador de menús para ver los tres comandos posibles.
Observe que al hacer clic en un comando, el título del controlador de menú cambia para mostrar ese comando. En la sección siguiente, agregaremos el código para activar estos comandos.
Implementación de los comandos del controlador de menú
En TWTestCommandPackageGuids.cs, agregue identificadores de comando para los tres elementos de menú después de los identificadores de comando existentes.
public const int cmdidMCItem1 = 0x130; public const int cmdidMCItem2 = 0x131; public const int cmdidMCItem3 = 0x132;
En TWTestCommand.cs, agregue el código siguiente en la parte superior de la
TWTestCommand
clase.private int currentMCCommand; // The currently selected menu controller command
En el constructor TWTestCommand, después de la última llamada al
AddCommand
método , agregue código para enrutar los eventos de cada comando a través de los mismos controladores.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; } }
Agregue un controlador de eventos a la clase TWTestCommand para marcar el comando seleccionado como activado.
private void OnMCItemQueryStatus(object sender, EventArgs e) { OleMenuCommand mc = sender as OleMenuCommand; if (null != mc) { mc.Checked = (mc.CommandID.ID == this.currentMCCommand); } }
Agregue un controlador de eventos que muestre un cuadro de mensajes cuando el usuario selecciona un comando en el controlador de menús:
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); } }
Probar el controlador de menús
Compile la solución y comience la depuración. Debería ver la instancia experimental.
Abra la herramienta de pruebaWindow en el menú Ver u otras ventanas .
El controlador de menú aparece en la barra de herramientas de la ventana de herramientas y muestra mc Item 1.
Haga clic en el botón del controlador de menú a la izquierda de la flecha.
Debería ver tres elementos, el primero de los cuales está seleccionado y tiene un cuadro de resaltado alrededor de su icono. Haga clic en MC Elemento 3.
Aparece un cuadro de diálogo con el mensaje Elemento 3 del controlador de menú Seleccionado. Observe que el mensaje corresponde al texto del botón del controlador de menú. El botón del controlador de menú ahora muestra MC Item 3.