Raccourcis clavier dans WPF

Je connais l'utilisation de _ Au lieu de&, ce que je regarde est tous lesCtrl + raccourcis de type.

Ctrl+Z pour annuler, Ctrl+S pour enregistrer etc.

Existe-t-il un moyen 'standard' de les implémenter dans les applications WPF? Ou est-ce un cas de rouler votre propre et les câbler à n'importe quelle commande/contrôle?

110
demandé sur Peter PAD 2009-09-01 12:58:22

8 réponses

Je comprends que la manière standard consiste à créer des commandes, puis à y ajouter vos touches de raccourci en tant que InputGestures. Cela permet aux touches de raccourci de fonctionner même si elles ne sont connectées à aucun contrôle. Et puisque les éléments de menu comprennent les gestes du clavier, ils afficheront automatiquement votre touche de raccourci dans le texte des éléments de menu, si vous accrochez cette commande à votre élément de menu.

A. créer un attribut statique pour maintenir la commande (de préférence en tant que propriété dans la classe statique que vous créez pour les commandes - mais pour un exemple simple, il suffit d'utiliser l'attribut statique dans la fenêtre .cs):

public static RoutedCommand MyCommand = new RoutedCommand( );

B. ajoutez la ou les touches de raccourci qui doivent invoquer la méthode:

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

C. créez une liaison de commande qui pointe vers votre méthode pour appeler execute, placez-les dans les liaisons de commande pour l'élément UI sous lequel il devrait fonctionner (par exemple, la fenêtre) et la méthode:

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

private void MyCommandExecuted( object sender, ExecutedRoutedEventArgs e ) { ... }
153
répondu Abby Fichtner 2009-09-26 21:41:18

J'ai trouvé que c'était exactement ce que je cherchais lié à la liaison de clé dans 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
répondu oliwa 2014-10-13 12:51:35

Essayez ce Code...

Créez D'abord un objet RoutedComand

  RoutedCommand newCmd = new RoutedCommand();
  newCmd.InputGestures.Add(new KeyGesture(Key.N, ModifierKeys.Control));
  CommandBindings.Add(new CommandBinding(newCmd, btnNew_Click));
11
répondu Shahid Neermunda 2015-10-31 10:39:34

Cela dépend de l'endroit où vous voulez les utiliser. TextBoxBase les contrôles dérivés implémentent déjà ces raccourcis. Si vous souhaitez utiliser des raccourcis clavier personnalisés, vous devriez jeter un oeil sur les commandes et les gestes de saisie. Voici un petit tutoriel de Switch on The Code: WPF Tutorial-liaisons de commandes et commandes personnalisées

J'espère que cela aide.

9
répondu Anvaka 2017-03-13 18:15:12

Documenter cette réponse pour les autres, car il existe un moyen beaucoup plus simple de le faire qui est rarement référencé, et ne nécessite pas du tout de toucher le XAML.

Pour lier un raccourci clavier, dans le constructeur de fenêtre, ajoutez simplement une nouvelle liaison de touches à la collection InputBindings. En tant que commande, passez votre classe de commande arbitraire qui implémente ICommand. Pour la méthode execute, implémentez simplement la logique dont vous avez besoin. Dans mon exemple ci-dessous, ma classe WindowCommand prend un délégué qu'elle exécutera chaque fois que invoquée. Lorsque je construis la nouvelle WindowCommand à transmettre avec ma liaison, j'indique simplement dans mon initialiseur, la méthode que je veux que la WindowCommand exécute.

Vous pouvez utiliser ce modèle pour créer vos propres raccourcis clavier rapides.

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)));
   ...
}

Créez une classe WindowCommand simple qui prend un délégué d'exécution pour déclencher n'importe quelle méthode définie dessus.

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
répondu Ayo I 2016-07-27 00:19:28

J'ai eu un problème similaire, et j'ai trouvé la réponse de @aliwa comme la solution la plus utile et la plus élégante; cependant, j'avais besoin d'une combinaison de touches spécifique, Ctrl + 1. Malheureusement, j'ai eu l'erreur suivante:

'1' ne peut pas être utilisé comme valeur pour 'Key'. Les nombres ne sont pas des valeurs d'énumération valides.

Avec un peu plus de recherche, j'ai modifié la réponse de @aliwa à ce qui suit:

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

J'ai trouvé que cela fonctionnait très bien pour n'importe quelle combinaison dont j'avais besoin.

3
répondu Nik 2017-12-06 01:18:53

VB.Net:

Public Shared SaveCommand_AltS As New RoutedCommand

à l'intérieur de l'événement chargé:

SaveCommand_AltS.InputGestures.Add(New KeyGesture(Key.S, ModifierKeys.Control))

Me.CommandBindings.Add(New CommandBinding(SaveCommand_AltS, AddressOf Me.save))

Aucun xaml nécessaire.

J'espère que cela aide.

2
répondu plaasmeisie 2016-05-30 09:19:39

Comment associer la commande avec un MenuItem:

<MenuItem Header="My command" Command="{x:Static local:MyWindow.MyCommand}"/>
-2
répondu Jiří Skála 2014-02-05 10:07:33