Eine Möglichkeit besteht darin, die Tastenkombinationen zu den Befehlen selbst hinzuzufügen InputGestures
. Befehle werden implementiert als RoutedCommands
.
Auf diese Weise können die Tastenkombinationen auch dann funktionieren, wenn sie nicht mit Steuerelementen verbunden sind. Und da Menüelemente Tastaturgesten verstehen, wird Ihre Tastenkombination automatisch im Text der Menüelemente angezeigt, wenn Sie diesen Befehl mit Ihrem Menüelement verknüpfen.
Erstellen Sie ein statisches Attribut, um einen Befehl zu speichern (vorzugsweise als Eigenschaft in einer statischen Klasse, die Sie für Befehle erstellen - aber für ein einfaches Beispiel verwenden Sie einfach ein statisches Attribut in window.cs):
public static RoutedCommand MyCommand = new RoutedCommand();
Fügen Sie die Tastenkombination (en) hinzu, die die Methode aufrufen sollen:
MyCommand.InputGestures.Add(new KeyGesture(Key.S, ModifierKeys.Control));
Erstellen Sie eine Befehlsbindung, die auf Ihre Methode verweist, die beim Ausführen aufgerufen werden soll. Fügen Sie diese in die Befehlsbindungen für das UI-Element ein, unter dem es funktionieren soll (z. B. das Fenster) und die Methode:
<Window.CommandBindings>
<CommandBinding Command="{x:Static local:MyWindow.MyCommand}" Executed="MyCommandExecuted"/>
</Window.CommandBindings>
private void MyCommandExecuted(object sender, ExecutedRoutedEventArgs e) { ... }
Executed
Code für den Befehl im Code-Behind (des Fensters oder der Benutzersteuerung) und nicht im Ansichtsmodell, im Gegensatz zur Verwendung eines üblichen Befehls (benutzerdefinierteICommand
Implementierung).Ich fand, dass dies genau das ist, wonach ich im Zusammenhang mit der Schlüsselbindung in WPF gesucht habe:
Siehe Blogbeitrag MVVM CommandReference und KeyBinding
quelle
Versuchen Sie diesen Code ...
Erstellen Sie zunächst ein RoutedComand-Objekt
quelle
Es hängt davon ab, wo Sie diese verwenden möchten.
TextBoxBase
-derivierte Steuerelemente implementieren diese Verknüpfungen bereits. Wenn Sie benutzerdefinierte Tastaturkürzel verwenden möchten, sollten Sie sich Befehle und Eingabegesten ansehen. Hier ist ein kleines Tutorial von Code einschalten : WPF-Tutorial - Befehlsbindungen und benutzerdefinierte Befehlequelle
Dokumentieren Sie diese Antwort für andere, da es einen viel einfacheren Weg gibt, auf den selten verwiesen wird und für den das Berühren der XAML überhaupt nicht erforderlich ist.
Um eine Tastenkombination zu verknüpfen, fügen Sie im Fensterkonstruktor einfach eine neue Tastenkombination zur InputBindings-Auflistung hinzu. Übergeben Sie als Befehl Ihre beliebige Befehlsklasse, die ICommand implementiert. Implementieren Sie für die Methode execute einfach die gewünschte Logik. In meinem Beispiel unten nimmt meine WindowCommand-Klasse einen Delegaten, den sie bei jedem Aufruf ausführt. Wenn ich den neuen WindowCommand so konstruiere, dass er mit meiner Bindung übergeben wird, gebe ich in meinem Initialisierer einfach die Methode an, die der WindowCommand ausführen soll.
Mit diesem Muster können Sie Ihre eigenen schnellen Tastaturkürzel erstellen.
Erstellen Sie eine einfache WindowCommand-Klasse, die einen Ausführungsdelegierten benötigt, um eine darauf festgelegte Methode auszulösen.
quelle
Ich hatte ein ähnliches Problem und fand die Antwort von @ aliwa die hilfreichste und eleganteste Lösung. Ich brauchte jedoch eine bestimmte Tastenkombination, Ctrl+ 1. Leider habe ich folgenden Fehler bekommen:
Mit ein wenig weiterer Suche habe ich die Antwort von @ aliwa auf Folgendes geändert:
Ich fand, dass dies für jede Kombination, die ich brauchte, ziemlich gut funktioniert.
quelle
<UserControl.InputBindings> <KeyBinding Gesture="Enter" Command="{Binding someCommand}"/> </UserControl.InputBindings>
VB.NET:
Innerhalb des geladenen Ereignisses:
Es wird keine XAML benötigt.
quelle
Obwohl die Top-Antworten korrekt sind, arbeite ich persönlich gerne mit angehängten Eigenschaften, damit die Lösung auf alle angewendet werden kann
UIElement
, insbesondere wenn derWindow
nicht weiß, auf welches Element fokussiert werden soll. Nach meiner Erfahrung sehe ich oft eine Komposition aus mehreren Ansichtsmodellen und Benutzersteuerelementen, wobei das Fenster oft nichts anderes als der Stammcontainer ist.Snippet
Mit dieser angehängten Eigenschaft können Sie eine Fokusverknüpfung für jedes UIElement definieren. Die Eingabebindung wird automatisch in dem Fenster registriert, das das Element enthält.
Verwendung (XAML)
Quellcode
Das vollständige Beispiel einschließlich der Implementierung von FocusElementCommand ist als Inhalt verfügbar: https://gist.github.com/shuebner20/c6a5191be23da549d5004ee56bcc352d
Haftungsausschluss: Sie können diesen Code überall und kostenlos verwenden. Bitte beachten Sie, dass dies ein Muster ist, das nicht für starke Beanspruchung geeignet ist. Beispielsweise gibt es keine Speicherbereinigung für entfernte Elemente, da der Befehl einen starken Verweis auf das Element enthält.
quelle
So ordnen Sie den Befehl einem zu
MenuItem
:quelle