Atajos de teclado en WPF

Sé sobre usar _ en lugar de &, lo que estoy viendo son todos los accesos directos de tipo Ctrl +.

Ctrl + Z para deshacer, Ctrl + S para guardar, etc.

¿Existe una forma “estándar” para implementar estos en las aplicaciones de WPF? ¿O se trata de un rollo propio y conectarlos a cualquier comando / control?

Entiendo que la forma estándar es crear Comandos y luego agregar sus teclas de método abreviado como InputGestures. Esto permite que las teclas de método abreviado funcionen incluso si no están conectadas a ningún control. Y dado que los elementos del menú comprenden los gestos del teclado, mostrarán automáticamente su tecla de acceso directo en el texto de los elementos del menú, si lo conecta con su elemento de menú.

A. Cree un atributo estático para mantener el comando (preferiblemente como propiedad en la clase estática que crea para los comandos, pero para un ejemplo simple, simplemente usando el atributo estático en la ventana .cs):

public static RoutedCommand MyCommand = new RoutedCommand( ); 

B. Agregue las teclas de método abreviado que deben invocar el método:

 MyCommand.InputGestures.Add( new KeyGesture( Key.S , ModifierKeys.Control )); 

C. Cree un enlace de comando que apunte a su método para invocar la ejecución, colóquelo en los enlaces de comando para el elemento de la UI en el que debería funcionar (por ejemplo, la ventana) y el método:

    private void MyCommandExecuted( object sender, ExecutedRoutedEventArgs e ) { ... } 

Descubrí que esto era exactamente lo que estaba buscando relacionado con el enlace de claves en WPF.

    

http://joyfulwpf.blogspot.com/2009/05/mvvm-commandreference-and-keybinding.html

Prueba este código …

Primero crea un objeto RoutedComand

  RoutedCommand newCmd = new RoutedCommand(); newCmd.InputGestures.Add(new KeyGesture(Key.N, ModifierKeys.Control)); CommandBindings.Add(new CommandBinding(newCmd, btnNew_Click)); 

Depende de dónde quiera usarlos. TextBoxBase controles derivados de TextBoxBase ya implementan esos accesos directos. Si desea utilizar atajos de teclado personalizados, debe echar un vistazo a los comandos y gestos de entrada. Aquí hay un pequeño tutorial de Switch on the Code: Tutorial de WPF – Enlaces de comandos y comandos personalizados

Espero que esto ayude.

Documentar esta respuesta para los demás, ya que hay una manera mucho más simple de hacer esto que rara vez se menciona, y no requiere tocar el XAML en absoluto.

Para vincular un atajo de teclado, en el constructor de Windows, simplemente agregue un nuevo enlace de clave a la colección InputBindings. Como comando, pase su clase de comando arbitraria que implementa ICommand. Para el método de ejecución, simplemente implemente la lógica que necesite. En mi ejemplo a continuación, mi clase de WindowCommand toma un delegado que ejecutará siempre que se invoque. Cuando construyo el nuevo WindowCommand para pasar con mi enlace, simplemente indico en mi inicializador, el método que quiero que WindowCommand ejecute.

Puede usar este patrón para crear sus propios atajos rápidos de teclado.

 public YourWindow() //inside any WPF Window constructor { ... //add this one statement to bind a new keyboard command shortcut InputBindings.Add(new KeyBinding( //add a new key-binding, and pass in your command object instance which contains the Execute method which WPF will execute new WindowCommand(this) { ExecuteDelegate = TogglePause //REPLACE TogglePause with your method delegate }, new KeyGesture(Key.P, ModifierKeys.Control))); ... } 

Cree una clase simple de WindowCommand que tome un delegado de ejecución para disparar cualquier método establecido en él.

 public class WindowCommand : ICommand { private MainWindow _window; //Set this delegate when you initialize a new object. This is the method the command will execute. You can also change this delegate type if you need to. public Action ExecuteDelegate { get; set; } //You don't have to add a parameter that takes a constructor. I've just added one in case I need access to the window directly. public WindowCommand(MainWindow window) { _window = window; } //always called before executing the command, mine just always returns true public bool CanExecute(object parameter) { return true; //mine always returns true, yours can use a new CanExecute delegate, or add custom logic to this method instead. } public event EventHandler CanExecuteChanged; //i'm not using this, but it's required by the interface //the important method that executes the actual command logic public void Execute(object parameter) { if (ExecuteDelegate != null) { ExecuteDelegate(); } else { throw new InvalidOperationException(); } } } 

Tuve un problema similar y encontré que la respuesta de @ aliwa es la solución más útil y más elegante; sin embargo, necesitaba una combinación de teclas específica, Ctrl + 1 . Desafortunadamente, recibí el siguiente error:

‘1’ no se puede usar como un valor para ‘Clave’. Los números no son valores de enumeración válidos.

Con un poco más de búsqueda, modifiqué la respuesta de @aliwa a lo siguiente:

    

Me pareció que funcionaba muy bien para cualquier combinación que necesitara.

VB.Net:

 Public Shared SaveCommand_AltS As New RoutedCommand 

Evento cargado en el interior:

 SaveCommand_AltS.InputGestures.Add(New KeyGesture(Key.S, ModifierKeys.Control)) Me.CommandBindings.Add(New CommandBinding(SaveCommand_AltS, AddressOf Me.save)) 

No se necesita xaml

Espero que esto ayude.

Cómo asociar el comando con un MenuItem :