Как я могу преобразовать 'System.Windows.Input.Key' в 'System.Windows.Forms.Keys'?
Я разрабатываю приложение в WPF, но некоторые компоненты записываются с использованием WinForms. Я не хочу, чтобы эти компоненты извлекали ключевой жест из части WPF и преобразовывали их в перечисление ключей (используется в WinForms).
Есть ли встроенный конвертер для этого? (возможно нет)
Знаете ли вы, что такое метод "проще, чем большой коммутатор"?
Ответы
Ответ 1
Keys formsKey = ...;
Key wpfKey = ...;
wpfKey = KeyInterop.KeyFromVirtualKey((int)formsKey);
formsKey = (Keys)KeyInterop.VirtualKeyFromKey(wpfKey);
KeyInterop class является "ключом", плюс тот факт, что перечисление Windows Forms Keys
имеет те же самые значения, что и Win 32 виртуальных ключа.
Ответ 2
На всякий случай люди все еще сталкиваются с проблемой модификатора 7 лет спустя, здесь мое решение, которое работало до сих пор:
public static class KeyEventExts
{
public static System.Windows.Forms.KeyEventArgs ToWinforms(this System.Windows.Input.KeyEventArgs keyEventArgs)
{
// So far this ternary remained pointless, might be useful in some very specific cases though
var wpfKey = keyEventArgs.Key == System.Windows.Input.Key.System ? keyEventArgs.SystemKey : keyEventArgs.Key;
var winformModifiers = keyEventArgs.KeyboardDevice.Modifiers.ToWinforms();
var winformKeys = (System.Windows.Forms.Keys)System.Windows.Input.KeyInterop.VirtualKeyFromKey(wpfKey);
return new System.Windows.Forms.KeyEventArgs(winformKeys | winformModifiers);
}
public static System.Windows.Forms.Keys ToWinforms(this System.Windows.Input.ModifierKeys modifier)
{
var retVal = System.Windows.Forms.Keys.None;
if(modifier.HasFlag(System.Windows.Input.ModifierKeys.Alt))
{
retVal |= System.Windows.Forms.Keys.Alt;
}
if (modifier.HasFlag(System.Windows.Input.ModifierKeys.Control))
{
retVal |= System.Windows.Forms.Keys.Control;
}
if (modifier.HasFlag(System.Windows.Input.ModifierKeys.None))
{
// Pointless I know
retVal |= System.Windows.Forms.Keys.None;
}
if (modifier.HasFlag(System.Windows.Input.ModifierKeys.Shift))
{
retVal |= System.Windows.Forms.Keys.Shift;
}
if (modifier.HasFlag(System.Windows.Input.ModifierKeys.Windows))
{
// Not supported lel
}
return retVal;
}
}
Ответ 3
Если вы хотите конвертировать модификаторы, используйте SystemKey, если вы смотрите на KeyEventArgs:
System.Windows.Input.KeyEventArgs args;
System.Windows.Input.Key wpfKey= args.Key == Key.System ? args.SystemKey : args.Key;
formsKey = (System.Windows.Forms.Keys)KeyInterop.VirtualKeyFromKey(wpfKey);
Ответ 4
Чтобы преобразовать перечисление WPF Key
в соответствующее перечисление WinForms Keys
, используйте статический член TryParse
класса Enum
:
Enum.TryParse(wpfKeyEnum.ToString(), out System.Windows.Forms.Keys winFormsKeyEnum)
Модификаторы WPF (перечисление ModifierKeys) можно преобразовать аналогично ключу Windows. В отличие от перечисления Windows.Input.ModifierKeys
WPF, перечисление Windows.Forms.Keys
различает левую и правую клавиши Windows и определяет соответствующие поля LWin
и RWin
.
Этот метод преобразования работает в обоих направлениях.
Пример
В этом примере перечисляются перечисления Key
и ModifierKeys
события включения ключа WPF в соответствующее перечисление WinForms Keys
.
С Windows.Input.Key
по System.Windows.Forms.Keys
private void OnPreviewKeyUp(object sender, System.Windows.Input.KeyEventArgs e)
{
// Convert key
if (Enum.TryParse(e.Key.ToString(), out System.Windows.Forms.Keys winFormsKey))
{
MessageBox.Show(winFormsKey + "=" + (int) winFormsKey); // A=65
}
}
С Windows.Input.ModifierKeys
по System.Windows.Forms.Keys
private void OnPreviewKeyUp(object sender, System.Windows.Input.KeyEventArgs e)
{
ModifierKeys modifiers = e.KeyboardDevice.Modifiers;
IEnumerable<ModifierKeys> pressedModifierKeys = Enum.GetValues(modifiers.GetType())
.Cast<ModifierKeys>()
.Where(modifiers.HasFlag);
// The ModifierKeys enumeration has a FlagsAttribute attribute
foreach (ModifierKeys modifier in pressedModifierKeys)
{
if (Enum.TryParse(modifier.ToString(), out System.Windows.Forms.Keys winFormsModifierKey))
{
MessageBox.Show(winFormsModifierKey + "=" + (int) winFormsModifierKey); // Alt=262144
}
}
}