Esistono alcuni costrutti globali che posso usare ogni volta che devo accedere se i pulsanti Control, Shift, Alt sono abbassati? Ad esempio all'interno MouseDown
dell'evento di a TreeView
.
Se é cosi, come?
Esistono alcuni costrutti globali che posso usare ogni volta che devo accedere se i pulsanti Control, Shift, Alt sono abbassati? Ad esempio all'interno MouseDown
dell'evento di a TreeView
.
Se é cosi, come?
Risposte:
Usa la classe Keyboard
. Usando Keyboard.IsKeyDown
puoi controllare se Control, Shift, Alt è inattivo ora.
Per il turno:
if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift))
{ /* Your code */ }
Per controllo:
if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))
{ /* Your code */ }
Per Alt:
if (Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt))
{ /* Your code */ }
C'è anche:
// 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
istruzione. Se vuoi prendere il tasto MAIUSC ma non preoccuparti se vengono premuti contemporaneamente altri modificatori, usa la (Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift
sintassi HasFlag o molto meglioKeyboard.Modifiers.HasFlag(ModifierKeys.Shift)
WIN+RightArrow
.
Keyboard.Modifiers
mostra comeNone
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;
}
}
Ecco come lo gestisco (usando PreviewKeyDown), diciamo che stiamo cercando Alt + R ...
private void OnPreviewKeyDown(object sender, KeyEventArgs e)
{
if ((Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt)
&& e.SystemKey == Key.R)
{
//do whatever
}
}
Forse qualcuno può chiarire perché ho dovuto usare e.SystemKey e non solo e.Key, forse a causa del modificatore? ma questo ha funzionato perfettamente per me durante la ricerca di modificatore + tasto.
Prendendo in prestito in parte da @Josh e in qualche modo simile a @Krushik, e facendo anche riferimento a una domanda sulla differenza tra KeyEventArgs.systemKey e KeyEventArgs.Key (rispondendo al motivo per cui Josh deve utilizzare SystemKey); in cui, con i tasti modificatori (come Alt), e.Key restituisce Key.System, e quindi la chiave "reale" si trova all'interno di e.SystemKey.
Un modo per aggirare questo, è prima di prendere la chiave 'reale', e quindi fare il tuo condizionale:
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)
invece di tutte le altre cose ...