2010-12-03 2 views
7

Ich habe eine Winforms-Anwendung, die ein WPF-Steuerelement (Avalon Edit, wenn es darauf ankommt) in einem ElementHost verwendet.WPF-Ereignisse in Winforms

Es scheint gut zu funktionieren, aber ich würde gerne in der Lage sein, KeyPress-Ereignisse dieses Steuerelements in der Winforms-Art (ohne RoutedCommands und InputGestures) zu behandeln, also konnte ich nur das KeyDown-Ereignis des Formulars mit KeyPreview festlegen , aber WPF-Ereignisse scheinen nicht in das Formular einzudringen.

Also im Grunde, wie können Sie auf ein KeyDown-Ereignis auf einem WPF-Steuerelement in der Winforms-Art zugreifen?

Antwort

6

können Sie versuchen, benutzerdefinierte Ereignishandler für WpfControl selbst, anstatt zu versuchen, WinForm des KeyDown hinzufügen zu verbinden.

Hier ist ein Beispiel. Nehmen wir an: Ihr WinForm ist vom Typ Form1, WpfControl ist UserControl1, und Element Host für WpfControl heißt (wird nie raten)) - ElementHost.

public Form1() 
{ 
    InitializeComponent(); 
    elementHost.ChildChanged += ElementHost_ChildChanged; 
} 

private void ElementHost_ChildChanged(object sender, ChildChangedEventArgs e) 
{ 
    var ctr = (elementHost.Child as UserControl1); 
    if (ctr == null) 
     return; 
    ctr.KeyDown += ctr_KeyDown; 
} 

void ctr_KeyDown(object sender, System.Windows.Input.KeyEventArgs e) 
{ 
    /* your custom handling for key-presses */ 
} 

UPD: e.KeyboardDevice.Modifiers (e System.Windows.Input.KeyEventArgs) speichert Informationen über Ctrl, Alt usw.

+0

Das Problem ist, dass System.Windows.Input.KeyEventArgs nicht wirklich die Zusatztasten aussetzen, so können Sie nicht nach "Strg + Z", nur nach "Z" oder "Strg" suchen. Auch die Key-Eigenschaft ist nicht eine bitweise Kombination von Modifikator und Schlüsseln aus dem, was ich gesehen habe, es ist nur die Haupt-Taste gedrückt. – Miguel

+0

@ Miguel, Siehe Update: e.KeyboardDevice.Modifiers ist was Sie brauchen. –

+0

Oh, danke dafür, das hätte ich nie gemacht. Upvoted. – Miguel