Gibt es einige globale Konstrukte, die ich verwenden kann, wenn ich darauf zugreifen muss, ob die Schaltflächen Strg, Umschalt, Alt gedrückt sind? Zum Beispiel innerhalb eines MouseDown
Ereignisses von a TreeView
.
Wenn das so ist, wie?
Gibt es einige globale Konstrukte, die ich verwenden kann, wenn ich darauf zugreifen muss, ob die Schaltflächen Strg, Umschalt, Alt gedrückt sind? Zum Beispiel innerhalb eines MouseDown
Ereignisses von a TreeView
.
Wenn das so ist, wie?
Antworten:
Klasse verwenden Keyboard
. Mit können Keyboard.IsKeyDown
Sie überprüfen, ob Strg, Umschalt, Alt jetzt deaktiviert ist.
Für die Schicht:
if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift))
{ /* Your code */ }
Zur Kontrolle:
if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))
{ /* Your code */ }
Für Alt:
if (Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt))
{ /* Your code */ }
Es gibt auch:
// Have to get this value before opening a dialog, or user will have released the control key
if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)
{
}
Keyboard.Modifiers == ModifierKeys.Shift
Anweisung. Wenn Sie die Umschalttaste abfangen möchten, sich aber nicht darum kümmern, ob andere Modifikatoren gleichzeitig gedrückt werden, verwenden Sie die (Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift
oder die viel bessere HasFlag-SyntaxKeyboard.Modifiers.HasFlag(ModifierKeys.Shift)
WIN+RightArrow
.
Keyboard.Modifiers
zeigt alsNone
private bool IsShiftKey { get; set; }
private void OnPreviewKeyDown(object sender, KeyEventArgs e)
{
IsShiftKey = Keyboard.Modifiers == ModifierKeys.Shift ? true : false;
if ((Key.Oem3 == e.Key || ((IsShiftKey && Key.Oem4 == e.Key) || (IsShiftKey && Key.Oem6 == e.Key) || (IsShiftKey && Key.Oem5 == e.Key)) && (validatorDefn as FormatValidatorDefinition).format == "packedascii"))
{
e.Handled = true;
}
}
So gehe ich damit um (mit PreviewKeyDown), sagen wir, wir suchen nach Alt + R ...
private void OnPreviewKeyDown(object sender, KeyEventArgs e)
{
if ((Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt)
&& e.SystemKey == Key.R)
{
//do whatever
}
}
Vielleicht kann jemand klären, warum ich e.SystemKey und nicht nur e.Key verwenden musste, vielleicht aufgrund des Modifikators? Aber das hat bei der Suche nach Modifikator + Schlüssel einwandfrei funktioniert.
Teilweise von @Josh entlehnt und @Krushik etwas ähnlich, und auch auf eine Frage zum Unterschied zwischen KeyEventArgs.systemKey und KeyEventArgs.Key verweisen (Antwort darauf, warum Josh SystemKey verwenden muss); wobei mit Modifikatortasten (wie Alt) e.Key Key.System zurückgibt und sich somit der 'echte' Schlüssel innerhalb von e.SystemKey befindet.
Eine Möglichkeit, dies zu umgehen, besteht darin, zuerst den "echten" Schlüssel abzurufen und dann Ihre Bedingung zu erfüllen:
private void OnPreviewKeyDown(object sender, KeyEventArgs e)
{
// Fetch the real key.
var key = e.Key == Key.System ? e.SystemKey : e.Key;
if ((Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt))
&& key == Key.Return)
{
// Execute your code.
}
}
(e.Key == Key.F && e.KeyboardDevice.Modifiers == ModifierKeys.Control)
anstelle aller anderen