Как я могу преобразовать 'System.Windows.Input.Key' в 'System.Windows.Forms.Keys'? - PullRequest
36 голосов
/ 20 июля 2009

Я разрабатываю приложение в WPF, но некоторые компоненты написаны с использованием WinForms. Я не хочу, чтобы эти компоненты извлекали жесты клавиш из WPF-части и преобразовывали их в перечисление Keys (используется в WinForms).

Для этого есть встроенный конвертер? (возможно нет) Знаете ли вы метод «проще, чем большой коммутатор», чтобы сделать это?

Ответы [ 3 ]

55 голосов
/ 20 июля 2009
Keys formsKey = ...;
Key wpfKey = ...;
wpfKey = KeyInterop.KeyFromVirtualKey((int)formsKey);
formsKey = (Keys)KeyInterop.VirtualKeyFromKey(wpfKey);

Класс KeyInterop является «ключом» плюс тот факт, что перечисление Windows Forms Keys имеет те же целочисленные значения, что и коды виртуальных ключей Win 32.

3 голосов
/ 07 декабря 2016

На тот случай, если люди все еще сталкиваются с проблемой модификаторов 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;
    }
}
0 голосов
/ 27 февраля 2011

Если вы хотите преобразовать модификаторы, используйте 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);
...