2009-07-20 11 views
31

WPF'de uygulama geliştiriyorum, ancak bazı bileşenler WinForms kullanılarak yazılmıştır. Bu bileşenleri WPF kısmından anahtar harekete geçirme ve bunları Keys enum'a (WinForms'ta kullanılan) dönüştürmem.'System.Windows.Input.Key' öğesini 'System.Windows.Forms.Keys' dosyasına nasıl dönüştürebilirim?

Bunun için dahili dönüştürücü var mı? (Muhtemelen) Bunu yapmak için "büyük anahtardan daha kolay" yöntemini biliyor musunuz?

cevap

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

KeyInterop class "tuşuna" artı, Windows Keys numaralandırma Win 32 sanal anahtar kodları ile aynı tamsayı değerleri vardır Forms olması. Eğer bir KeyEventArgs bakıyoruz eğer, değiştiricilerini dönüştürmek SystemKey kullanmak istiyorsanız

+2

Teşekkürler. Bu gerçekten havalı. Ama değiştiricileri nasıl dönüştürebilirim? –

0

:

insanlar hala 7 yıl sonra değiştirici sorunla karşılaşırsanız Her ihtimale karşı
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

, burada şimdiye kadar çalıştı benim çözüm :

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; 
    } 
} 
İlgili konular