En este documento voy a hablar de los menús en Wpf y de los commandos definidos en la clase ApplicationCommands
Existe lo que podemos llamar la forma tradicional de declarar el menú es decir usando el evento Clic para declarar un escuchador que ejecute el código al pulsar la opción del menú, y usar una imagen, normalmente Png, o Jpg. Algo parecido a esto:
<DockPanel Grid.Row="0" x:Name="dockPanelMenu"
Height="31" Width="Auto"
HorizontalAlignment="Stretch"
VerticalAlignment="Top"
DockPanel.Dock="Top"
LastChildFill="False">
<Menu x:Name="MenuGeneral" Height="23" Width="Auto" DockPanel.Dock="Top">
<Separator />
<MenuItem Header="Guardar" x:Name="MenuArchivoSave"
InputGestureText="Ctrl + G"
ToolTip="Guardar un documento del disco"
Click="MenuArchivoSave_Click">
<MenuItem.Icon>
<Image Width="16" Height="16" Stretch="UniformToFill"
Source="pack://application:,,,/03Vistas_Layer/0302_ImagenesComunes/MenuFile/Save_6530.png" />
</MenuItem.Icon>
</MenuItem>
</Menu>
</DockPanel>
Private Sub MenuArchivoSave_Click(sender As Object, e As RoutedEventArgs) Throw New NotImplementedException("MenuArchivoSave_Click") End Sub
Emplea el evento Clic
Para las direcciones de las imágenes utiliza el formato de direcciones pack (más información aquí)
InputGestureText
Esta etiqueta únicamente sirve para que se muestre en la opción correspondiente del menú las teclas que activan la opción de menú. Solo hace eso y nada más.
Es decir, el hecho de que salgan en la opción de menú no quiere decir que funcionen, hay que programarlas específicamente
La Clase ApplicationCommands, proporciona un conjunto estándar de comandos relacionados con la aplicación, como puedan ser Copy, Paste, Save, New, Etc. El problema es que la implementación específica hay que escribirla, y para ello hay que dar varios pasos.
En el diseñador (Codigo xaml), Definir CommandBindings
<Window.CommandBindings> <!-- Menú archivo --> <CommandBinding Command="ApplicationCommands.New" Executed="NewCommandBinding_Executed" /> <CommandBinding Command="ApplicationCommands.Open" Executed="OpenCommandBinding_Executed" /> <CommandBinding Command="ApplicationCommands.Save" Executed="SaveCommandBinding_Executed" /> </Window.CommandBindings>
Observa que:
Escribir el código del escuchador en la ventana e código
Private Sub NewCommandBinding_Executed(sender As Object, e As ExecutedRoutedEventArgs) 'Este ejemplo toca un sonido (por hacer alguna cosa) Dim objBeep As New Microsoft.VisualBasic.Devices.Audio objBeep.PlaySystemSound(System.Media.SystemSounds.Beep) End Sub
¡¡ Nota!! El IDE lo escribe automáticamente si pulsas el botón derecho del ratón y en el menú emergente escoges la opción [ir a la definición]
Decirle al menú, que cuando se le pulse, llame a este comando para que se ejecute, y eso se hace con el atributo Command
Ejemplo en la ventana del diseñador Xaml
(Solo escribo una de las opciones del menú)
<MenuItem Header="_Guardar"
x:Name="MenuArchivoSave"
InputGestureText="Ctrl + G"
ToolTip="Guardar un documento del disco"
Command="ApplicationCommands.New"
Visibility="Visible">
<MenuItem.Icon>
<Image Width="16" Height="16" Stretch="UniformToFill"
Source="pack://application:,,,/03Vistas_Layer/0302_ImagenesComunes/MenuFile/Save_6530.png" />
</MenuItem.Icon>
</MenuItem>
Observa que hemos sustituido el atributo [Click] por el atributo [Command]
Definir el InputGestureText para que se ejecute el [Command] usando el teclado
<Window.InputBindings> <KeyBinding Key="N" Modifiers="Control" Command="ApplicationCommands.New" /> <KeyBinding Key="O" Modifiers="Control" Command="ApplicationCommands.Open"/> <KeyBinding Key="F2" Modifiers="Alt" Command="ApplicationCommands.Print"/> </Window.InputBindings> O bien <Window.InputBindings> <KeyBinding Command="ApplicationCommands.New" Gesture="CTRL+N" /> <KeyBinding Command="ApplicationCommands.Open" Gesture="CTRL+O" /> <KeyBinding Command="ApplicationCommands.Print" Gesture="Alt+F2" /> </Window.InputBindings>
Es decir o usas los atributos [Key] y [Modifiers] juntos, o usas únicamente el atributo [Gesture]. Microsoft en su documentación indica que no deben usarse a la vez.
Una Observación, las teclas que definas aquí son las que funcionan con el teclado, insisto en que el atributo [InputGestureText] solo muestra la cadena en la opción del menú
Y eso es todo, la opción de menú ya está funcionando sin problemas
Problema ¿ que ocurre si necesito una opción de menú ( por ejemplo Save All Guardar Todo)
Pues, antes de nada, tendré que definir un Command, luego los pasos a dar son iguales, con la diferencia de que se llama al Command que acabamos de definir.
En la ventana del diseñador definir el Comando para hacer el trabajo [ Save All], que será algo asi:
<Window.Resources> <RoutedUICommand x:Key="SaveAllCmd" Text="Describe lo que hace este Command, Por ejemplo, Guardar todos los ficheros abiertos"> <RoutedUICommand.InputGestures> <KeyGesture>Ctrl+Shift+</KeyGesture> <!-- ATENCION. InputGestures muestra y ejecuta el comando al pulsar la tecla El modificador Ctrl, debe ir el primero --> </RoutedUICommand.InputGestures> </RoutedUICommand> </Window.Resources>
En el diseñador (Codigo xaml), Definir CommandBindings
<Window.CommandBindings> <!-- Menú archivo --> <CommandBinding Command="{StaticResource SaveAllCmd}" Executed="SaveAllCmd_Executed"/> </Window.CommandBindings>
Escribir el código del escuchador en la ventana e código
Private Sub SaveAsCommandBinding_Executed(sender As Object, e As ExecutedRoutedEventArgs) 'Este ejemplo toca un sonido (por hacer alguna cosa) Dim objBeep As New Microsoft.VisualBasic.Devices.Audio objBeep.PlaySystemSound(System.Media.SystemSounds.Beep) End Sub
Decirle al menú, que cuando se le pulse, llame a este comando para que se ejecute.
<MenuItem Header="Save All (Todo) " x:Name="MenuArchivoGuardarTodo" ToolTip="Guardar todos los documentos" Command="{StaticResource SaveAllCmd}"/>
Definir el InputGestureText para que se ejecute el [Command] usando el teclado
Pues no , en este caso ya no hace falta porque las teclas se definieron cuando se define el [RoutedUICommand]. (recuerda que lo hicimos en el paso cero
Para incluir una imagen en el menú hay que usar la etiqueta [Icon]
<MenuItem.Icon> <Image Width="16" Height ="16" Stretch="UniformToFill" Source="pack://application:,,,/03Vistas_Layer/0302_ImagenesComunes/MenuFile/Save_6530.png" /> </MenuItem.Icon>
Si usas imagenes xaml hay que copiar y pegar el código de la imagen entre las etiquetas
También es conveniente que escojas el icono de 16 puntos.
© 1997 - - La Güeb de Joaquín | |||||
Joaquín Medina Serrano
|
|||||
|
Codificación | |
Fecha de creación | |
Última actualización | |
![]() |