Une façon consiste à ajouter vos touches de raccourci aux commandes elles-mêmes sous forme de InputGestures
. Les commandes sont implémentées comme RoutedCommands
.
Cela permet aux touches de raccourci de fonctionner même si elles ne sont connectées à aucun contrôle. Et comme 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.
Créez un attribut statique pour contenir une commande (de préférence en tant que propriété dans une classe statique que vous créez pour les commandes - mais pour un exemple simple, en utilisant simplement un attribut statique dans window.cs):
public static RoutedCommand MyCommand = new RoutedCommand();
Ajoutez la ou les touches de raccourci qui doivent appeler la méthode:
MyCommand.InputGestures.Add(new KeyGesture(Key.S, ModifierKeys.Control));
Créez une liaison de commande qui pointe vers votre méthode à appeler lors de l'exécution. Mettez-les dans les liaisons de commande pour l'élément d'interface utilisateur 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) { ... }
Executed
code de la commande se retrouvera dans le code-behind (de la fenêtre ou du contrôle utilisateur) plutôt que dans le modèle de vue, par opposition à l'utilisation d'une commande habituelle (ICommand
implémentation personnalisée ).J'ai trouvé que c'était exactement ce que je recherchais en ce qui concerne la liaison de clé dans WPF:
Voir l'article de blog MVVM CommandReference and KeyBinding
la source
Essayez ce code ...
Créez d'abord un objet RoutedComand
la source
Cela dépend de l'endroit où vous souhaitez 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 devez jeter un œil aux commandes et aux gestes de saisie. Voici un petit tutoriel de Switch on the Code : Tutoriel WPF - Liaisons de commandes et commandes personnaliséesla source
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 qui ne nécessite pas du tout de toucher au XAML.
Pour lier un raccourci clavier, dans le constructeur Window, ajoutez simplement un nouveau KeyBinding à la collection InputBindings. En tant que commande, passez votre classe de commande arbitraire qui implémente ICommand. Pour la méthode d'exécution, 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 qu'elle sera appelée. Lorsque je construis le nouveau WindowCommand à transmettre avec ma liaison, j'indique simplement dans mon initialiseur, la méthode que je veux que WindowCommand exécute.
Vous pouvez utiliser ce modèle pour créer vos propres raccourcis clavier rapides.
Créez une classe WindowCommand simple qui prend un délégué d'exécution pour déclencher toute méthode définie dessus.
la source
J'ai eu un problème similaire et j'ai trouvé que la réponse de @ aliwa était 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:
Avec un peu plus de recherche, j'ai modifié la réponse de @ aliwa à ce qui suit:
J'ai trouvé que cela fonctionnait très bien pour toutes les combinaisons dont j'avais besoin.
la source
<UserControl.InputBindings> <KeyBinding Gesture="Enter" Command="{Binding someCommand}"/> </UserControl.InputBindings>
VB.NET:
À l'intérieur de l' événement chargé :
Aucun XAML n'est nécessaire.
la source
Bien que les principales réponses soient correctes, j'aime personnellement travailler avec les propriétés attachées pour permettre à la solution d'être appliquée à tout
UIElement
, en particulier lorsque leWindow
n'est pas conscient de l'élément qui doit être ciblé. D'après mon expérience, je vois souvent une composition de plusieurs modèles de vue et de contrôles utilisateur, où la fenêtre n'est souvent rien de plus que le conteneur racine.Fragment
Avec cette propriété jointe, vous pouvez définir un raccourci de focus pour n'importe quel UIElement. Il enregistrera automatiquement la liaison d'entrée dans la fenêtre contenant l'élément.
Utilisation (XAML)
Code source
L'exemple complet, y compris l'implémentation de FocusElementCommand, est disponible sous forme de fichier essentiel: https://gist.github.com/shuebner20/c6a5191be23da549d5004ee56bcc352d
Avertissement: Vous pouvez utiliser ce code partout et gratuitement. Veuillez garder à l'esprit qu'il s'agit d'un échantillon qui ne convient pas à un usage intensif. Par exemple, il n'y a pas de garbage collection des éléments supprimés car la commande contiendra une référence forte à l'élément.
la source
Comment associer la commande à un
MenuItem
:la source