Problembehandlung für Hybridanwendungen

Aktualisiert: November 2007

In diesem Thema werden häufige Probleme aufgelistet, die beim Erstellen von Hybridanwendungen auftreten können, bei denen sowohl WPF-Technologie als auch Windows Forms-Technologie verwendet wird.

Überlappende Steuerelemente

Steuerelemente überlappen sich möglicherweise nicht wie erwartet. Windows Forms verwendet verschiedene HWNDs für die einzelnen Steuerelemente. WPF verwendet ein HWND für den gesamten Inhalt einer Seite. Dieser Unterschied bei der Implementierung verursacht unerwartetes Verhalten beim Überlappen.

Ein in WPF gehostetes Windows Forms-Steuerelement wird immer über dem WPF-Inhalt angezeigt.

In einem ElementHost-Steuerelement gehosteter WPF-Inhalt wird in der Z-Reihenfolge des ElementHost-Steuerelements angezeigt. ElementHost-Steuerelemente können sich überlappen, aber der gehostete WPF-Inhalt wird nicht zusammengeführt, oder es findet keine Interaktion statt.

Untergeordnete Eigenschaft

Die WindowsFormsHost-Klasse und die ElementHost-Klasse können nur ein einzelnes untergeordnetes Steuerelement oder Element hosten. Um mehrere Steuerelemente oder Elemente zu hosten, müssen Sie einen Container als untergeordneten Inhalt verwenden. Sie können beispielsweise Windows Forms-Steuerelemente für Schaltflächen und Kontrollkästchen zu einem System.Windows.Forms.Panel-Steuerelement hinzufügen und anschließend den Bereich der Child-Eigenschaft eines WindowsFormsHost-Steuerelements hinzufügen. Sie können die Steuerelemente für die Schaltfläche und das Kontrollkästchen jedoch nicht einzeln zu demselben WindowsFormsHost-Steuerelement hinzufügen.

Skalieren

WPF und Windows Forms haben verschiedene Skalierungsmodelle. Nicht alle WPF-Skalierungstransformationen sind für Windows Forms-Steuerelemente sinnvoll. Das Skalieren eines Windows Forms-Steuerelements auf 0 (null) ist zwar möglich, aber wenn Sie versuchen, das gleiche Steuerelement danach auf einen Wert zu skalieren, der nicht 0 entspricht, bleibt die Größe des Steuerelements 0. Weitere Informationen finden Sie unter Überlegungen zum Layout für das WindowsFormsHost-Element.

Adapter

Beim Bearbeiten der WindowsFormsHost-Klasse und der ElementHost-Klasse kann es zu Verwechslungen kommen, da diese Klassen einen ausgeblendeten Container enthalten. Sowohl die WindowsFormsHost-Klasse als auch die ElementHost-Klasse enthält einen ausgeblendeten Container, der zum Hosten von Inhalt verwendet und als Adapter bezeichnet wird. Für das WindowsFormsHost-Element wird der Adapter von der System.Windows.Forms.ContainerControl-Klasse abgeleitet. Für das ElementHost-Steuerelement wird der Adapter vom DockPanel-Element abgeleitet. Wenn Sie in anderen Interoperationsthemen Verweise auf den Adapter finden, handelt es sich um diesen Container.

Schachtelung

Das Schachteln eines WindowsFormsHost-Elements in einem ElementHost-Steuerelement wird nicht unterstützt. Das Schachteln eines ElementHost-Steuerelements in einem WindowsFormsHost-Element wird ebenfalls nicht unterstützt.

Fokus

Der Fokus in WPF hat eine andere Funktionsweise als der in Windows Forms. Dies kann in einer Hybridanwendung zu Fokusproblemen führen. Wenn sich beispielsweise der Fokus innerhalb eines WindowsFormsHost-Elements befindet und Sie die Seite entweder minimieren und wiederherstellen oder ein modales Dialogfeld anzeigen, kann der Fokus innerhalb des WindowsFormsHost-Elements verloren gehen. Der Fokus befindet sich immer noch im WindowsFormsHost-Element, jedoch möglicherweise nicht im Steuerelement.

Auch die Datenvalidierung wird vom Fokus beeinflusst. Die Validierung funktioniert in einem WindowsFormsHost-Element, jedoch nicht, wenn Sie durch Drücken der TAB-TASTE das WindowsFormsHost-Element verlassen oder zwischen zwei verschiedenen WindowsFormsHost-Elementen wechseln.

Eigenschaftenzuordnung

Einige Eigenschaftenzuordnungen erfordern eine ausführliche Auslegung, um unterschiedliche Implementierungen in der WPF-Technologie und der Windows Forms-Technologie zu überbrücken. Durch Eigenschaftenzuordnungen ist der Code in der Lage, auf Änderungen von Schriftarten, Farben und anderen Eigenschaften zu reagieren. Eigenschaftenzuordnungen funktionieren im Allgemeinen durch Überwachen von PropertyChanged-Ereignissen oder OnPropertyChanged-Aufrufen und durch das Festlegen von geeigneten Eigenschaften für das untergeordnete Steuerelement oder den dazugehörigen Adapter. Weitere Informationen finden Sie unter Eigenschaftenzuordnung von Windows Forms und WPF.

Layoutbezogene Eigenschaften in gehostetem Inhalt

Wenn die WindowsFormsHost.Child-Eigenschaft oder die ElementHost.Child-Eigenschaft zugewiesen ist, werden mehrere layoutbezogene Eigenschaften im gehosteten Inhalt automatisch festgelegt. Wenn diese Inhaltseigenschaften geändert werden, kann dies ein unerwartetes Layoutverhalten verursachen.

Der gehostete Inhalt ist so angedockt, dass die übergeordneten Elemente WindowsFormsHost und ElementHost gefüllt werden. Um dieses Füllverhalten zu aktivieren, werden beim Festlegen der untergeordneten Eigenschaft mehrere Eigenschaften festgelegt. In der folgenden Tabelle werden die Inhaltseigenschaften aufgeführt, die von der ElementHost-Klasse und der WindowsFormsHost-Klasse festgelegt werden.

Host-Klasse

Inhaltseigenschaften

ElementHost

Height

Width

Margin

VerticalAlignment

HorizontalAlignment

WindowsFormsHost

Margin

Dock

AutoSize

Location

MaximumSize

Legen Sie diese Eigenschaften nicht direkt im gehosteten Inhalt fest. Weitere Informationen finden Sie unter Überlegungen zum Layout für das WindowsFormsHost-Element.

Navigationsanwendungen behalten möglicherweise den Benutzerstatus nicht bei. Das WindowsFormsHost-Element erstellt seine Steuerelemente neu, wenn es in einer Navigationsanwendung verwendet wird. Untergeordnete Steuerelemente werden neu erstellt, wenn der Benutzer die Seite verlässt, die das WindowsFormsHost-Element hostet, und dann zu der Seite zurückkehrt. Jeglicher vom Benutzer eingegebener Inhalt geht verloren.

Interoperation für Nachrichtenschleifen

Wenn sie mit Windows Forms-Nachrichtenschleifen arbeiten, werden Meldungen möglicherweise nicht erwartungsgemäß verarbeitet. Die EnableWindowsFormsInterop-Methode wird vom WindowsFormsHost-Konstruktor aufgerufen. Diese Methode fügt der WPF-Nachrichtenschleife einen Meldungsfilter hinzu. Dieser Filter ruft die Control.PreProcessMessage-Methode auf, wenn ein System.Windows.Forms.Control das Ziel der Meldung war, und die Meldung wird übersetzt/weitergeleitet.

Wenn Sie ein Window in einer Windows Forms-Nachrichtenschleife mit Application.Run anzeigen, können Sie nur dann etwas eingeben, wenn Sie die EnableModelessKeyboardInterop-Methode aufrufen. Die EnableModelessKeyboardInterop-Methode verwendet ein Window und fügt einen System.Windows.Forms.IMessageFilter hinzu, wodurch schlüsselbezogene Meldungen in die WPF Nachrichtenschleife umgeleitet werden. Weitere Informationen finden Sie unter Eingabearchitektur für die Interoperabilität zwischen Windows Forms und WPF.

Deckkraft und Überlagern

Das Überlagern wird von der HwndHost-Klasse nicht unterstützt. Wenn die Opacity-Eigenschaft auf dem WindowsFormsHost-Element festgelegt wird, hat dies keine Auswirkungen, und es findet kein Blending mit anderen WPF-Fenstern statt, für die AllowsTransparency auf true festgelegt ist.

Dispose

Wenn Klassen nicht korrekt freigegeben werden, kann es zu Ressourcenverlusten kommen. Vergewissern Sie sich, dass in Ihren Hybridanwendungen die WindowsFormsHost-Klasse und die ElementHost-Klasse freigegeben werden, da es sonst zu Ressourcenverlusten kommen kann. Windows Forms gibt ElementHost-Steuerelemente frei, wenn das nicht modale übergeordnete Form-Element geschlossen wird. WPF gibt WindowsFormsHost-Elemente frei, wenn die Anwendung beendet wird. In einem Window einer Windows Forms-Nachrichtenschleife kann ein WindowsFormsHost-Element angezeigt werden. In diesem Fall empfängt der Code möglicherweise keine Benachrichtigung, dass die Anwendung beendet wird.

Aktivieren von visuellen Stilen

Visuelle Microsoft Windows XP-Stile auf einem Windows Forms-Steuerelement dürfen nicht aktiviert werden. Die Application.EnableVisualStyles-Methode wird in der Vorlage für eine Windows Forms-Anwendung aufgerufen. Obwohl diese Methode nicht standardmäßig aufgerufen wird, erhalten Sie visuelle Microsoft Windows XP-Stile für Steuerelemente, wenn Sie Visual Studio zum Erstellen eines Projekts verwenden. Dafür muss Version 6.0 der Datei Comctl32.dll zur Verfügung stehen. Sie müssen die EnableVisualStyles-Methode aufrufen, bevor Handles auf dem Thread erstellt werden. Weitere Informationen finden Sie unter Gewusst wie: Aktivieren von visuellen Stilen in einer Hybridanwendung.

Lizenzierte Steuerelemente

Lizenzierte Windows Forms-Steuerelemente, die Lizenzierungsinformationen in einem Meldungsfeld für den Benutzer anzeigen, können bei einer Hybridanwendung unerwartetes Verhalten verursachen. Einige lizenzierte Steuerelemente zeigen als Reaktion auf das Erstellen von Handles ein Dialogfeld an. Ein lizenziertes Steuerelement kann den Benutzer beispielsweise darüber informieren, dass eine Lizenz erforderlich ist oder dass der Benutzer das Steuerelement noch drei Mal zu Testzwecken verwenden kann.

Das WindowsFormsHost-Element wird von der HwndHost-Klasse abgeleitet, und das Handle für das untergeordnete Steuerelement wird innerhalb der BuildWindowCore-Methode erstellt. Die HwndHost-Klasse lässt es nicht zu, dass Meldungen in der BuildWindowCore-Methode verarbeitet werden, aber wenn ein Dialogfeld angezeigt wird, verursacht dies, dass Meldungen gesendet werden. Um dieses Lizenzierungsszenario zu ermöglichen, rufen Sie die Control.CreateControl-Methode auf dem Steuerelement auf, bevor Sie es als das untergeordnete Element des WindowsFormsHost-Elements zuweisen.

WPF-Designer

Sie können den WPF-Inhalt mithilfe von Windows Presentation Foundation (WPF)-Designer für Visual Studio entwerfen. In den folgenden Abschnitten sind häufige Probleme aufgelistet, die beim Erstellen von Hybridanwendungen mit dem WPF-Designer auftreten können.

BackColorTransparent wird zur Entwurfszeit ignoriert

Die BackColorTransparent-Eigenschaft funktioniert zur Entwurfszeit ggf. nicht wie erwartet.

Wenn ein WPF-Steuerelement nicht auf einem sichtbaren übergeordneten Element angeordnet ist, ignoriert die WPF-Laufzeit den BackColorTransparent-Wert. Der Grund dafür, dass BackColorTransparent ggf. ignoriert wird, besteht darin, dass das ElementHost-Objekt in einem separaten AppDomain-Objekt erstellt wird. Wenn Sie die Anwendung ausführen, funktioniert BackColorTransparent jedoch wie erwartet.

Entwurfszeitfehlerliste wird angezeigt, wenn der Ordner obj gelöscht wird

Wenn der Ordner obj gelöscht wird, wird die Entwurfszeitfehlerliste angezeigt.

Beim Entwerfen mit ElementHost verwendet der Windows Forms-Designer generierte Dateien im Ordner Debug bzw. Release innerhalb des Ordners obj des Projekts. Wenn Sie diese Dateien löschen, wird die Entwurfszeitfehlerliste angezeigt. Um dieses Problem zu beheben, müssen Sie das Projekt neu erstellen. Weitere Informationen finden Sie unter Entwurfszeitfehler im Windows Forms-Designer.

ElementHost und IME

In einem ElementHost-Objekt gehostete WPF-Steuerelemente unterstützen die ImeMode-Eigenschaft momentan nicht. Änderungen von ImeMode werden von den gehosteten Steuerelementen ignoriert.

Siehe auch

Aufgaben

Gewusst wie: Aktivieren von visuellen Stilen in einer Hybridanwendung

Konzepte

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

Überlegungen zum Layout für das WindowsFormsHost-Element

Eigenschaftenzuordnung von Windows Forms und WPF

Entwurfszeitfehler im Windows Forms-Designer

Referenz

ElementHost

WindowsFormsHost

Weitere Ressourcen

Interoperabilität im WPF-Designer

Migration und Interoperabilität