Чи є якісь глобальні конструкції, якими я можу користуватися, коли мені потрібно отримати доступ, чи кнопки Control, Shift, Alt вниз? Наприклад, всередині MouseDown
події TreeView
.
Якщо так, як?
Чи є якісь глобальні конструкції, якими я можу користуватися, коли мені потрібно отримати доступ, чи кнопки Control, Shift, Alt вниз? Наприклад, всередині MouseDown
події TreeView
.
Якщо так, як?
Відповіді:
Використовуйте клас Keyboard
. Використовуючи Keyboard.IsKeyDown
ви можете перевірити, чи тепер кнопка Control, Shift, Alt знижена.
Для зміни:
if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift))
{ /* Your code */ }
Для контролю:
if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))
{ /* Your code */ }
Для Alt:
if (Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt))
{ /* Your code */ }
Також є:
// 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
оператором. Якщо ви хочете (Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift
зафіксувати клавішу shift, але не хвилюйтесь, якщо інші модифікатори натиснуті одночасно, скористайтесь синтаксисом HasFlag або набагато кращимKeyboard.Modifiers.HasFlag(ModifierKeys.Shift)
WIN+RightArrow
.
Keyboard.Modifiers
показує якNone
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;
}
}
Це, як я впораюся з цим (використовуючи PreviewKeyDown), скажімо, ми шукаємо Alt + R ...
private void OnPreviewKeyDown(object sender, KeyEventArgs e)
{
if ((Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt)
&& e.SystemKey == Key.R)
{
//do whatever
}
}
Можливо, хтось може зрозуміти, чому мені довелося використовувати e.SystemKey, а не лише e.Key, можливо через модифікатор? але це працювало для мене бездоганно під час пошуку модифікатора + ключ.
Частково запозичує у @Josh, і дещо схоже на @Krushik, а також посилається на питання про різницю між KeyEventArgs.systemKey та KeyEventArgs.Key (відповідаючи, чому Джош повинен використовувати SystemKey); де, з ключами-модифікаторами (такими як Alt), e.Key повертає Key.System, і, таким чином, "справжній" ключ знаходиться в межах e.SystemKey.
Шляхом цього є спочатку отримати «справжній» ключ, а потім виконати ваше умовне:
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)
замість усіх інших речей ...