Freigeben über


Eingabearchitektur für die Interoperabilität zwischen Windows Forms und WPF

Die Interoperabilität zwischen WPF und Windows Forms erfordert, dass beide Technologien über die entsprechende Tastatureingabeverarbeitung verfügen. In diesem Thema wird beschrieben, wie diese Technologien Tastatur- und Nachrichtenverarbeitung implementieren, um eine reibungslose Interoperabilität in Hybridanwendungen zu ermöglichen.

Dieses Thema enthält die folgenden Unterabschnitte:

  • Nicht modale Formulare und Dialogfelder

  • Verarbeitung von WindowsFormsHost-Tastatureingaben und -Meldungen

  • ElementHost-Tastatur und Nachrichtenverarbeitung

Nicht modale Formulare und Dialogfelder

Rufen Sie die EnableWindowsFormsInterop-Methode für das WindowsFormsHost-Element auf, um ein nicht modales Formular oder Dialogfeld in einer WPF-basierten Anwendung zu öffnen.

Rufen Sie die EnableModelessKeyboardInterop-Methode für das ElementHost-Steuerelement auf, um eine nicht modale WPF-Seite in einer Windows Forms-basierten Anwendung zu öffnen.

Verarbeitung von WindowsFormsHost-Tastatureingaben und -Meldungen

Wenn sie von einer WPF-basierten Anwendung gehostet wird, besteht die Windows Forms-Tastatur- und Nachrichtenverarbeitung aus den folgenden Komponenten:

  • Die WindowsFormsHost Klasse erhält Nachrichten aus der WPF-Nachrichtenschleife, die von der ComponentDispatcher Klasse implementiert wird.

  • Die WindowsFormsHost-Klasse erstellt eine Ersatz-Windows Forms-Nachrichtenschleife, um sicherzustellen, dass die normale Windows Forms-Tastaturverarbeitung erfolgt.

  • Die WindowsFormsHost-Klasse implementiert das IKeyboardInputSink-Interface, um die Fokusverwaltung mit WPF zu koordinieren.

  • Die WindowsFormsHost-Steuerelemente registrieren sich selbst und starten ihre Meldungsschleifen.

In den folgenden Abschnitten werden diese Teile des Prozesses ausführlicher beschrieben.

Abrufen von Meldungen aus der WPF-Meldungsschleife

Die ComponentDispatcher Klasse implementiert den Nachrichtenschleifen-Manager für WPF. Die ComponentDispatcher-Klasse stellt Hooks bereit, mit denen externe Clients Nachrichten filtern können, bevor WPF sie verarbeitet.

Mit der Interaktionsimplementierung wird das ComponentDispatcher.ThreadFilterMessage-Ereignis verarbeitet, durch das Windows Forms-Steuerelemente Meldungen vor WPF-Steuerelementen verarbeiten können.

Windows Forms-Ersatzmeldungsschleife

Standardmäßig enthält die System.Windows.Forms.Application-Klasse die primäre Nachrichtenschleife für Windows Forms-Anwendungen. Während der Interoperabilität verarbeitet die Windows Forms-Nachrichtenschleife keine Nachrichten. Daher muss diese Logik reproduziert werden. Der Handler für das ComponentDispatcher.ThreadFilterMessage-Ereignis führt die folgenden Schritte aus:

  1. Filtert die Meldung mithilfe der IMessageFilter-Schnittstelle.

  2. Die Control.PreProcessMessage-Methode wird aufgerufen.

  3. Übersetzt und versendet die Nachricht, falls erforderlich.

  4. Die Meldung wird an das hostende Steuerelement übergeben, wenn keine anderen Steuerelemente die Meldung verarbeiten.

IKeyboardInputSink-Implementierung

Die Ersatzmeldungsschleife übernimmt die Verwaltung von Tastatureingaben. Daher ist die IKeyboardInputSink.TabInto-Methode das einzige IKeyboardInputSink-Mitglied, das in der WindowsFormsHost-Klasse implementiert werden muss.

Standardmäßig gibt die HwndHost-Klasse für ihre IKeyboardInputSink.TabInto-Implementierung false zurück. Dies verhindert, dass Sie mit der Tabulatortaste von einem WPF-Steuerelement zu einem Windows Forms-Steuerelement wechseln.

Die WindowsFormsHost-Implementierung der IKeyboardInputSink.TabInto-Methode führt die folgenden Schritte aus:

  1. Das erste oder letzte Windows Forms-Steuerelement wird ermittelt, das im WindowsFormsHost-Steuerelement enthalten ist und den Fokus erhalten kann. Die Wahl des Steuerelements hängt von Informationen zum Durchlauf ab.

  2. Legt den Fokus auf das Steuerelement fest und gibt true zurück.

  3. false wird zurückgegeben, wenn kein Steuerelement den Fokus erhalten kann.

WindowsFormsHost-Registrierung

Wenn der Fensterhandle für ein WindowsFormsHost-Steuerelement erstellt wird, ruft das WindowsFormsHost-Steuerelement eine interne statische Methode auf, die seine Anwesenheit für die Meldungsschleife registriert.

Während der Registrierung prüft das WindowsFormsHost-Steuerelement die Meldungsschleife. Wenn die Meldungsschleife noch nicht gestartet wurde, wird der ComponentDispatcher.ThreadFilterMessage-Ereignishandler erstellt. Die Meldungsschleife gilt als aktiv, wenn der ComponentDispatcher.ThreadFilterMessage-Ereignishandler angefügt ist.

Wenn der Fensterhandle zerstört wird, entfernt sich das WindowsFormsHost-Steuerelement selbst aus der Registrierung.

ElementHost-Tastatur und Nachrichtenverarbeitung

Wenn sie von einer Windows Forms-Anwendung gehostet werden, besteht die WPF-Tastatur- und Nachrichtenverarbeitung aus den folgenden Komponenten:

In den folgenden Abschnitten werden diese Teile ausführlicher beschrieben.

Schnittstellenimplementierungen

In Windows Forms werden Tastaturmeldungen an den Fensterhandle des Steuerelements weitergeleitet, das den Fokus hat. Im Steuerelement ElementHost werden diese Nachrichten an das gehostete Element weitergeleitet. Zu diesem Zweck bietet das ElementHost-Steuerelement eine HwndSource-Instanz. Wenn das ElementHost-Steuerelement den Fokus hat, leitet die HwndSource-Instanz die meisten Tastatureingaben so weiter, dass sie von der WPF-Klasse InputManager verarbeitet werden können.

Die HwndSource-Klasse implementiert die schnittstellen IKeyboardInputSink und IKeyboardInputSite.

Die Tastaturinteraktion beruht auf der Implementierung der OnNoMoreTabStops-Methode zur Behandlung von Eingaben mit der TAB-TASTE und Pfeiltasten, die den Fokus aus gehosteten Elementen herausbewegen.

Wechseln mit der TAB-TASTE und Pfeiltasten

Die Windows Forms-Auswahllogik wird den Methoden IKeyboardInputSink.TabInto und OnNoMoreTabStops zugeordnet, um die TAB- und Pfeiltastennavigation zu implementieren. Durch Überschreiben der Select-Methode wird diese Zuordnung erreicht.

Befehls- und Dialogfeldtasten

Um WPF die erste Möglichkeit zum Verarbeiten von Befehlstasten und Dialogfelder zu geben, ist die Vorverarbeitung von Windows Forms-Befehlen mit der TranslateAccelerator-Methode verbunden. Durch Überschreiben der Control.ProcessCmdKey-Methode werden die beiden Technologien verbunden.

Mit der TranslateAccelerator-Methode können die gehosteten Elemente jede beliebige Tastenmeldung verarbeiten, z. B. WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN oder WM_SYSKEYUP, einschließlich Befehlstasten, wie TAB-, EINGABE-, ESC- und Pfeiltasten. Wenn eine Tastenmeldung nicht bearbeitet wird, wird sie in der Windows Forms-Vorgängerhierarchie zur Bearbeitung nach oben gesendet.

Beschleunigerverarbeitung

Um Beschleuniger ordnungsgemäß zu verarbeiten, muss die Windows Forms-Beschleunigerverarbeitung mit der WPF-Klasse AccessKeyManager verbunden sein. Darüber hinaus müssen alle WM_CHAR Nachrichten ordnungsgemäß an gehostete Elemente weitergeleitet werden.

Da die standardmäßige HwndSource Implementierung der TranslateChar-Methode falsezurückgibt, werden WM_CHAR Nachrichten mithilfe der folgenden Logik verarbeitet:

  • Die Control.IsInputChar-Methode wird außer Kraft gesetzt, um sicherzustellen, dass alle WM_CHAR Nachrichten an gehostete Elemente weitergeleitet werden.

  • Wenn die ALT-TASTE gedrückt wird, lautet die Systemnachricht WM_SYSCHAR. Windows Forms wird diese Nachricht nicht durch die Methode IsInputChar vorverarbeiten. Daher wird die ProcessMnemonic-Methode so überschrieben, dass AccessKeyManager von WPF nach einem registrierten Beschleuniger abgefragt wird. Wenn ein registrierter Beschleuniger gefunden wird, verarbeitet AccessKeyManager ihn.

  • Wenn die ALT-TASTE nicht gedrückt wird, verarbeitet die WPF-Klasse InputManager die unbehandelte Eingabe. Wenn es sich bei der Eingabe um einen Beschleuniger handelt, wird er von AccessKeyManager verarbeitet. Das PostProcessInput-Ereignis wird für WM_CHAR-Meldungen behandelt, die nicht verarbeitet wurden.

Wenn der Benutzer die ALT-TASTE drückt, werden visuelle Hinweise des Beschleunigers auf dem gesamten Formular angezeigt. Um dieses Verhalten zu unterstützen, erhalten alle ElementHost-Steuerelemente auf dem aktiven Formular WM_SYSKEYDOWN-Meldungen unabhängig davon, welches Steuerelement den Fokus hat.

Meldungen werden nur an ElementHost-Steuerelemente im aktiven Formular gesendet.

Siehe auch