Das du Benutzereingaben vom View zum ViewModel deiner WPF-Anwendung über ICommand schicken kannst, habe ich bereits im LernMoment Command.CanExecute beschrieben. Seit WPF 4.0 (veröffentlicht mit .NET 4.0) kannst du mit wenigen XAML-Anweisungen eine Taste an dein Command binden.
Die WPF Bedienelemente erben alle von System.Windows.UIElement. Diese Klasse bietet die für diesen Zweck relevante Eigenschaft InputBindings. Dabei handelt es sich um eine Auflistung von Instanzen der Klasse InputBinding bzw. Instanzen der von ihr abgeleiteten Klassen KeyBinding oder MouseBinding.
Wenn du beispielsweise ganz allgemein eine Tastenkombination (wie Ctrl+S) zum Speichern einer Datei oder ähnliches an deiner Anwendung definieren willst, dann kannst du das wie folgt machen:
<Window.InputBindings>
<KeyBinding Gesture="Ctrl+S" Command="{Binding DateiSpeichernCommand}" />
</Window.InputBingings>
Nun kannst du einfach “Ctrl + S” drücken und das Speichernkommando wird ausgeführt. Dabei ist es egal welches Bedienelement gerade den Fokus hat. Damit dies funktioniert, muss dein ViewModel als DataContext zur Verfügung stehen und ein ICommand mit dem Namen DateiSpeichernCommand anbieten. Im zugehörigen Beispiel findest du alle Details.
Du kannst Tastenkombinationen auch an spezifische Bedienelemente binden. Dann wird das Kommando nur ausgeführt, wenn das Bedienelement den Fokus hat und du dann die Tastenkombination betätigst. Da alle Bedienelemente von System.Windows.UIElement erben, geht das genau so wie im vorherigen Beispiel:
<TextBox BorderBrush="Black" BorderThickness="2" Margin="50" TextWrapping="Wrap">
Sobald diese TextBox den Fokus hat, kannst du mit der Tastenkombination "Ctrl + Shift + S" speichern.
<TextBox.InputBindings>
<KeyBinding Gesture="Ctrl+Shift+S" Command="{Binding DateiSpeichernCommand}"/>
</TextBox.InputBindings>
</TextBox>
Möchtest du ein KeyBinding erstellen, welches nur eine Taste und nicht eine Tastenkombination umfasst, dann verwendest du die Eigenschaft Key anstelle von Gesture. So könntest du beispielsweise F5 zum erneuten Laden des Inhalts deiner Anwendung verwenden:
<Window.InputBindings>
<KeyBinding Key="F5" Command="{Binding NeuLadenCommand}" />
</Window.InputBingings>
Jetzt erstmal viel Spaß mit drücken von Tasten
Jan
PS: Beachten solltest du, dass das KeyBinding immer auf KeyDown reagiert. Dies kann über KeyBinding nicht geändert werden.
Merke
- Die meisten Bedien- und Anzeigeelemente in WPF haben die Eigenschaft
InputBindings, welche vonSystem.Windows.UIElementvererbt wird. - Der Eigenschaft
InputBindingskannst du sowohl Instanzen vonKeyBindingwie auchMouseBindingzuweisen. - Willst du einzelne Tasten verwenden, dann ist die Eigenschaft
KeyBinding.Keydas richtige für dich. - Eine Tastenkombination kannst du der Eigenschaft
KeyBinding.Gestureübergeben. Dabei trennst du die einzelnen Tasten mit einem+. - Verwendest du
KeyBinding, wird dein Kommando immer beiKeyDownund nicht beiKeyUpausgeführt.
Lernquiz
Verwende folgende Fragen, um das Gelernte von heute zu festigen:
- An welchen Elementen kannst du ein
KeyBindingverwenden? - Wie definierst du für eine Anwendung, dass das Kommando
HilfeCommandbeim drücken von Shift und F1 ausgeführt wird? - Welche Klasse ist noch wichtig im Kontext von
KeyBinding?
Am besten schaust du dir morgen und dann nochmal in ein paar Tagen die vorherigen Fragen an und beantwortest sie, ohne den Text vorher gelesen zu haben.
Weitere Informationen
- Den kompletten Quelltext zum heutigen Lernmoment findest du hier.
- Die Beschreibung der Klasse
KeyBindingfindest auf MSDN
