Pregunta

Estoy desarrollando una aplicación de interfaz de usuario de WPF.

Tengo un menú en la parte superior de la pantalla, que tiene elementos de menú Archivo, Ayuda.

En archivo - > Funciones de backend (la tecla de acceso directo es ctrl + B), Salir (Ctrl + x) elementos del submenú.

al hacer clic en cualquier elemento del submenú, se abre la ventana correspondiente.

Entonces, sin usar el mouse, presionando ctrl + B o Ctrl + x, ¿cómo se puede abrir la ventana?

También, ¿cómo puedo mostrar una pequeña línea debajo de " F " en el archivo para que cuando el usuario presione Alt + F, el menú Archivo debería estar visible.

Estoy trabajando en WPF usando C #.

¿Fue útil?

Solución

Querrá investigar ICommand, RoutedUICommand, InputGestureCollection y CommandManager. Es un poco más el trabajo de infraestructura inicial, pero el patrón de Comando de WPF le permite compartir un comando a través del menú principal, el menú contextual, los clics en los botones, etc. / Deshabilite constantemente y agrega una capa más de direccionamiento indirecto para reducir la repetición del código.

El siguiente ejemplo está en VB.Net (lo siento, pero espero que sea fácil de traducir).

Implemente cada una de sus acciones requeridas como una clase que implementa ICommand:

Public Class OpenWindowCommand
  Implements ICommand

  Public Function CanExecute(parameter as Object) As Boolean Implements System.Windows.Input.ICommand.CanExecute
    'enter code that determines whether this command should be enabled or not
    'if you are listening to some backend logic that changes this state, you can
    'raise a CanExecuteChanged event
  End Function

  Public Sub Execute(parameter as Object) Implements System.Windows.Input.ICommand.Execute
     'code that you want to run for the action
  End Sub
 End Class

Cree una clase que almacene instancias compartidas de cada uno de sus comandos.

Public Class MyCommands
  Private Shared ReadyOnly openWindowCmd As ICommand = New OpenWindowCommand()
  Private Shared _openWindow as RoutedUICommand

  Shared Sub New()
    'static constructor
    Dim shortcut = New KeyGesture(Key.W, ModifierKeys.Control)
    RegisterCommand(_openWindow, "OpenWindow", "Open...", shortcut, AddressOf ExecuteOpenWindow, AddressOf CanExecuteOpenWindow)
    'add more commands as needed
  End Sub

  Private Shared Sub RegisterCommand(ByRef command as RoutedUICommand, ByVal name as String, ByVal text as String, ByVal gesture as KeyGesture, ByVal executeHandler as ExecutedRoutedEventHandler, ByVal canExecuteHandler as CanExecuteRoutedEventHandler)
    Dim inputs = New InputGestureCollection()
    If gesture IsNot Nothing Then inputs.Add(gesture)
    command = New RoutedUICommand(text, name, GetType(MyCommands), inputs)
    Dim binding = New CommandBinding(command, executeHandler, canExecuteHandler)
    Application.Current.MainWindow.CommandBindings.Add(binding)
    CommandManager.RegisterClassCommandBinding(GetType(Window),binding)
  End Sub

  Public Shared ReadOnly Property OpenWindow() as RoutedUICommand
    Get
      Return _openWindow
    End Get
  End Property
  Public Shared Sub ExecuteOpenWindow(sender as Object, e as ExecutedRoutedEventArgs)
    openCmd.Execute(e.Parameter)
  End Sub
  Public Shared Sub CanExecuteSave(sender as Object, e as CanExecuteRoutedEventArgs)
    e.CanExecute = openCmd.CanExecute(e.Parameter)
    e.Handled = True
  End Sub

End Class

Ahora en su XAML para su menú, puede enlazar a este comando:

<Window.Resources>
  <local:MyCommands x:Key="commands"/>
</Window.Resources>
...
<MenuItem Name="mnuOpenWindow" Command="{Binding Path=OpenWindow}"/>

Esto es un poco más que el requisito mínimo para usar Comandos, pero en una aplicación bastante grande, he encontrado esta infraestructura adicional bastante útil. Una vez que los comandos se escriben y se registran, el enlace a ellos en cualquier documento XAML es trivial y al exponer Propiedades compartidas para cada acción a través de la clase MyCommands, puede acceder a los comandos únicamente en código si es necesario.

Otros consejos

Para agregar la línea pequeña que representa el acelerador del elemento del menú, use un guión bajo en el XAML:

<MenuItem Header="_File">
    <MenuItem Header="_Backend Features" />
    <MenuItem Header="E_xit" />
</MenuItem>

En cuanto a las teclas de acceso directo, en primer lugar, recomendaría no usar Ctrl + X para Salir, ya que generalmente se usa para Cortar. Normalmente salir no tiene una tecla de acceso directo, pero presionar Alt + F4 para cerrar la ventana principal tendrá el mismo efecto.

Con respecto a su pregunta real, tiene un par de opciones, pero para ambas debe usar Comandos para implementar el manejo de sus MenuItems en lugar del evento Click .

La primera opción es establecer un InputBinding para cada tecla de acceso directo. Se haría algo como esto en su ventana principal:                   

Para el atributo Command , necesitaría especificar una expresión que represente el comando para ese acceso directo (usaría el mismo Command al definir el MenuItem , también). Si tiene una clase de Comandos , podría hacer algo como lo siguiente:

static class Commands
{
    public static ICommand BackendFeaturesCommand = ...;
}

Y luego en XAML:

<KeyBinding Key="B" Modifiers="Control"
    Command="{x:Static Commands.BackendFeaturesCommand}" />

La otra opción es definir su comando como una RoutedUICommand , y especifique un InputGesture para ello. Esto se encargará de conectar la tecla de acceso directo para usted.

Puede ver el ejemplo de ShortCutKey del WPF Application Framework (WAF) . Es bastante simple de entender.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top