Atajos de teclado en WPF


Sé usar _ en lugar de &, lo que estoy viendo son todos los atajos Ctrl + type.

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

¿Hay una forma 'estándar' para implementarlas en aplicaciones WPF? ¿O es un caso de rodar los tuyos y conectarlos a cualquier comando / control?

Author: Peter PAD, 2009-09-01

8 answers

Entiendo que la forma estándar es mediante la creación de comandos y luego agregar sus teclas de acceso directo a ellos como InputGestures. Esto permite que las teclas de acceso directo funcionen incluso si no están conectadas a ningún control. Y dado que los elementos de menú entienden los gestos del teclado, mostrarán automáticamente tu tecla de método abreviado en el texto de los elementos de menú, si conectas ese comando a tu elemento de menú.

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

public static RoutedCommand MyCommand = new RoutedCommand( );

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

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

C. Cree enlaces de comandos que apunten a su método para llamar a execute, colóquelos en los enlaces de comandos para el elemento de la interfaz de usuario bajo el cual debería funcionar ( por ejemplo, la ventana) y el método:

<Window.CommandBindings>
    <CommandBinding Command="{x:Static local:MyWindow.MyCommand}" Executed="MyCommandExecuted"/>
</Window.CommandBindings>

private void MyCommandExecuted( object sender, ExecutedRoutedEventArgs e ) { ... }
 153
Author: Abby Fichtner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-26 21:41:18

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

<Window.InputBindings>
        <KeyBinding Modifiers="Control"
                    Key="N"
                    Command="{Binding CreateCustomerCommand}" />
</Window.InputBindings>

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

 81
Author: oliwa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-13 12:51:35

Pruebe 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));
 11
Author: Shahid Neermunda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-31 10:39:34

Depende de dónde quieras usarlos. TextBoxBase los controles derivados 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: WPF Tutorial-Enlaces de comandos y Comandos personalizados

Espero que esto ayude.

 9
Author: Anvaka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-13 18:15:12

Documentar esta respuesta para otros, ya que hay una forma mucho más simple de hacer esto que rara vez se hace referencia, y no requiere tocar el XAML en absoluto.

Para vincular un atajo de teclado, en el constructor de ventanas simplemente agregue un nuevo enlace de teclas a la colección InputBindings. Como comando, pase la clase de comando arbitraria que implementa ICommand. Para el método execute, simplemente implementa cualquier lógica que necesites. En mi ejemplo a continuación, mi clase WindowCommand toma un delegado que se ejecutará cada vez que se invoque. Cuando construyo el nuevo WindowCommand para pasar con mi enlace, simplemente indico en mi inicializador, el método que quiero que ejecute el WindowCommand.

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

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 WindowCommand simple 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();
        }
    }
}
 4
Author: Ayo I,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-27 00:19:28

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

'1' no se puede utilizar como valor para 'Key'. Los números no son valores de enumeración válidos.

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

<Window.InputBindings>
    <KeyBinding Gesture="Ctrl+1" Command="{Binding MyCommand}"/>
</Window.InputBindings>

Encontré que esto funciona muy bien para cualquier combinación que necesitaba.

 3
Author: Nik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-06 01:18:53

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.

 2
Author: plaasmeisie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-30 09:19:39

Cómo asociar el comando con un MenuItem:

<MenuItem Header="My command" Command="{x:Static local:MyWindow.MyCommand}"/>
 -2
Author: Jiří Skála,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-05 10:07:33