Freigeben über


Überlegungen zum Layout für das WindowsFormsHost-Element

In diesem Thema wird beschrieben, wie das WindowsFormsHost-Element mit dem WPF-Layoutsystem interagiert.

WPF und Windows Forms unterstützen andere, aber ähnliche Logik für die Größe und Positionierung von Elementen auf einem Formular oder einer Seite. Wenn Sie eine hybride Benutzeroberfläche (UI) erstellen, die Steuerelemente für Windows Forms in WPF hostet, integriert das WindowsFormsHost-Element die beiden Layoutschemas.

Unterschiede im Layout zwischen WPF und Windows Forms

WPF verwendet auflösungsunabhängiges Layout. Alle WPF-Layoutdimensionen werden mithilfe von geräteunabhängigen Pixeln angegeben. Ein geräteunabhängiges Pixel hat die Größe von neunzig Sechstel Zoll und ist auflösungsunabhängig, sodass Sie ähnliche Ergebnisse erhalten, unabhängig davon, ob Sie einen 72-dpi-Monitor oder einen 19.200-dpi-Drucker rendern.

WPF basiert auch auf dynamischem Layout. Dies bedeutet, dass ein UI-Element sich auf einem Formular oder einer Seite entsprechend seinem Inhalt, seinem übergeordneten Layoutcontainer und der verfügbaren Bildschirmgröße anordnet. Dynamisches Layout erleichtert die Lokalisierung, indem sie die Größe und Position von UI-Elementen automatisch anpassen, wenn die Zeichenfolgen die Länge ändern.

Das Layout in Windows Forms ist geräteabhängig und hoch wahrscheinlich statisch. In der Regel werden Steuerelemente für Windows Forms vollständig auf einem Formular positioniert, indem Dimensionen verwendet werden, die in Hardwarepixeln angegeben sind. Windows Forms unterstützt jedoch einige dynamische Layoutfunktionen, wie in der folgenden Tabelle zusammengefasst.

Layoutfunktion Beschreibung
Automatische Größenanpassung Einige Steuerelemente für Windows Forms ändern sich selbst, um ihren Inhalt ordnungsgemäß anzuzeigen. Weitere Informationen finden Sie unter Übersicht über die Eigenschaft der automatischen Größenanpassung.
Verankern und Andocken Steuerelemente für Windows Forms unterstützen die Positionierung und Größe basierend auf dem übergeordneten Container. Weitere Informationen finden Sie unter Control.Anchor und Control.Dock.
Automatische Skalierung Containersteuerelemente ändern ihre Größe und ihre untergeordneten Elemente basierend auf der Auflösung des Ausgabegeräts oder der Größe in Pixeln der Standardcontainerschriftart eigenständig. Weitere Informationen finden Sie unter Automatische Skalierung in Windows Forms.
Andere Layoutcontainer Die Steuerelemente FlowLayoutPanel und TableLayoutPanel ordnen ihre untergeordneten Steuerelemente und Größe entsprechend ihren Inhalten an.

Layoutbeschränkungen

Im Allgemeinen können Steuerelemente für Windows Forms nicht weitestgehend als Block in WPF skaliert und umgewandelt werden. Die folgende Liste beschreibt die bekannten Einschränkungen, wenn das WindowsFormsHost-Element versucht, sein gehostetes Steuerelement für Windows Forms in das WPF-Layout zu integrieren.

  • In einigen Fällen können Steuerelemente für Windows Forms nicht geändert oder nur auf eine bestimmte Dimensionen beschränkt werden. Zum Beispiel unterstützt ein ComboBox-Steuerelement für Windows Forms nur eine einzige Größe, die vom Schriftgrad des Steuerelements definiert wird. In einem dynamischen WPF-Layout, in dem Elemente vertikal getreckt werden können, wird ein gehostetes ComboBox-Steuerelement nicht so gestreckt wie erwartet.

  • Steuerelemente für Windows Forms können nicht gedreht oder geneigt werden. Das WindowsFormsHost-Element löst das LayoutError-Ereignis aus, wenn Sie eine Neigungs- oder Drehungstransformation anwenden. Wenn Sie das LayoutError-Ereignis nicht behandeln, wird ein InvalidOperationException ausgelöst.

  • In den meisten Fällen unterstützen Windows Forms-Steuerelemente für Windows Forms keine proportionale Skalierung. Obwohl die gesamten Dimensionen des Steuerelements skaliert werden, können untergeordnete Steuerelemente und Komponenten des Steuerelements unter Umständen nicht wie erwartet skaliert werden. Diese Einschränkung hängt davon ab, wie gut jedes Steuerelement für Windows Forms eine Skalierung unterstützt. Darüber hinaus können Sie Steuerelemente für Windows Forms nicht auf eine Größe von 0 Pixeln skalieren.

  • Steuerelemente für Windows Forms unterstützen die automatische Skalierung, in der das Formular die Größe selbst und deren Steuerelemente basierend auf dem Schriftgrad automatisch ändert. In einer WPF-Benutzeroberfläche bewirkt eine Änderung des Schriftgrads keine Größenänderung des gesamten Layouts; einzelne Elemente können ihre Größe jedoch dynamisch anpassen.

Z-Reihenfolge

In einer WPF-Benutzeroberfläche können Sie die Z-Reihenfolge der Elemente ändern, um ihr Verhalten bei Überlappung zu steuern. Ein gehostetes Steuerelement für Windows Forms wird in einem separaten HWND gezeichnet, sodass es sich also immer oben auf den WPF-Elementen befindet.

Ein gehostetes Steuerelement für Windows Forms wird auch oben auf allen Adorner-Elementen gezeichnet.

Layoutverhalten

In den folgenden Abschnitten werden bestimmte Aspekte des Layoutverhaltens beschrieben, wenn Steuerelemente für Windows Forms in WPF gehostet werden.

Skalierung, Einheitenkonvertierung und Geräteunabhängigkeit

Wenn das WindowsFormsHost-Element Vorgänge ausführt, an denen WPF- und Windows Forms-Dimensionen beteiligt sind, werden zwei Koordinatensysteme beteiligt: geräteunabhängige Pixel für WPF und Hardware-Pixel für Windows Forms. Daher müssen Sie richtige Einheiten- und Skalierungskonvertierungen anwenden, um ein konsistentes Layout zu erreichen.

Die Konvertierung zwischen den Koordinatensystemen hängt von der aktuellen Geräteauflösung und allen Layout- oder Renderingtransformationen ab, die auf das WindowsFormsHost-Element oder auf seine Vorgänger angewendet werden.

Wenn das Ausgabegerät 96 dpi ist und keine Skalierung auf das WindowsFormsHost-Element angewendet wurde, entspricht ein geräteunabhängiges Pixel einem Hardware-Pixel.

Alle anderen Fälle erfordern die Koordinatensystemkalierung. Die Größe des gehosteten Steuerelements wird nicht geändert. Stattdessen versucht das WindowsFormsHost-Element, das gehostete Steuerelement und alle untergeordneten Steuerelemente zu skalieren. Da Windows Forms die Skalierung nicht vollständig unterstützt, skaliert das WindowsFormsHost-Element in dem Grad, der von bestimmten Steuerelementen unterstützt wird.

Überschreiben Sie die ScaleChild-Methode, um benutzerdefiniertes Skalierungsverhalten für das gehostete Steuerelement für Windows Forms bereitzustellen.

Zusätzlich zur Skalierung behandelt das WindowsFormsHost-Element Rundungs- und Überlauffälle, wie in der folgenden Tabelle beschrieben.

Konvertierungsproblem Beschreibung
Runden WPF-geräteunabhängige Pixeldimensionen werden als double angegeben und Windows Forms Hardware-Pixeldimensionen werden als int angegeben. In Fällen, in denen double-basierte Dimensionen in int-basierte Dimensionen konvertiert werden, verwendet das WindowsFormsHost-Element standardmäßige Rundung, sodass Bruchwerte kleiner als 0,5 auf 0 gerundet werden.
Überlauf Wenn das WindowsFormsHost-Element von double-Werten in int-Werte konvertiert wird, ist ein Überlauf möglich. Werte, die größer sind als MaxValue, werden auf MaxValue gesetzt.

Eigenschaften, die das Layoutverhalten in Steuerelementen für Windows Forms und WPF-Elementen steuern, werden entsprechend dem WindowsFormsHost-Element zugeordnet. Weitere Informationen finden Sie unter Windows Forms and WPF Property Mapping (Eigenschaftenzuordnung von Windows Forms und WPF).

Layoutänderungen im gehosteten Steuerelement

Layoutänderungen im gehosteten Steuerelement für Windows Forms werden an WPF verteilt, um Layout-Updates auszulösen. Die InvalidateMeasure-Methode bei WindowsFormsHost stellt sicher, dass Layoutänderungen im gehosteten Steuerelement dazu führen, dass das WPF-Layoutmodul ausgeführt wird.

Kontinuierlich angepasste Steuerelemente für Windows Forms

Steuerelemente für Windows Forms, die eine kontinuierliche Skalierung unterstützen, interagieren vollständig mit dem WPF-Layoutsystem. Das WindowsFormsHost-Element verwendet die MeasureOverride- und ArrangeOverride-Methoden wie üblich, um das gehostete Steuerelement für Windows Forms zu vergrößern und anzuordnen.

Größenalgorithmus

Das WindowsFormsHost-Element verwendet die folgende Prozedur, um das gehostete Steuerelement zu vergrößern:

  1. Das ArrangeOverride-Element überschreibt die WindowsFormsHost- und MeasureOverride-Methoden.

  2. Um die Größe des gehosteten Steuerelements zu ermitteln, ruft die MeasureOverride-Methode die GetPreferredSize-Methode des gehosteten Steuerelements eine Einschränkung auf, die von der an die MeasureOverride-Methode übergebenen Einschränkung übersetzt wird.

  3. Die ArrangeOverride-Methode versucht, das gehostete Steuerelement auf die angegebene Größeneinschränkung festzulegen.

  4. Wenn die Size-Eigenschaft des gehosteten Steuerelements mit der angegebenen Einschränkung übereinstimmt, wird das gehostete Steuerelement an die Einschränkung angepasst.

Wenn die Size-Eigenschaft nicht mit der angegebenen Einschränkung übereinstimmt, unterstützt das gehostete Steuerelement nicht die kontinuierliche Größe. Das MonthCalendar-Steuerelement ermöglicht zum Beispiel nur diskrete Größen. Die zulässigen Größen für dieses Steuerelement bestehen aus ganzen Zahlen (die die Anzahl der Monate darstellen) für sowohl Höhe als auch Breite. In Fällen wie diesen verhält sich das WindowsFormsHost-Element wie folgt:

  • Wenn die Size-Eigenschaft eine größere Größe als die angegebene Einschränkung zurückgibt, klammert das Element das gehostete WindowsFormsHost-Steuerelement aus. Höhe und Breite werden separat behandelt, sodass das gehostete Steuerelement in beiden Richtungen abgeschnitten werden kann.

  • Wenn die Size-Eigenschaft eine kleinere Größe als die angegebene Einschränkung zurückgibt, akzeptiert WindowsFormsHost diesen Größenwert und gibt den Wert an das WPF-Layoutsystem zurück.

Weitere Informationen