2009-07-20 44 views
31

私はWPFでアプリケーションを開発していますが、いくつかのコンポーネントはWinFormsを使って書かれています。私はWPFの部分からキージェスチャーを引き出し、Keys enum(WinFormsで使用される)に変換するこれらのコンポーネントをwan'tしました。'System.Windows.Forms.Keys'に 'System.Windows.Input.Key'をどのように変換できますか?

そのためのコンバータが組み込まれていますか? (おそらくない) これを行うには、 "簡単なスイッチケースよりも簡単な"方法がありますか?

答えて

52
Keys formsKey = ...; 
Key wpfKey = ...; 
wpfKey = KeyInterop.KeyFromVirtualKey((int)formsKey); 
formsKey = (Keys)KeyInterop.VirtualKeyFromKey(wpfKey); 

KeyInterop classは「キー、」プラスWindowsはKeys列挙が勝つ32の仮想キーコードと同じ整数値を有するフォームという事実です。

+2

ありがとうございました。かっこいい。しかし、どのように修飾子を変換できますか? –

0

あなたは修飾子を変換したい場合は、KeyEventArgsで探しているならSystemKeyを使用します。

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); 
1

ただ人々はまだ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; 
    } 
} 
関連する問題