Důležité informace o rozložení elementu WindowsFormsHost
Toto téma popisuje, jak WindowsFormsHost element komunikuje se systémem rozložení WPF.
WPF a Windows Forms podporují různé, ale podobné logiky pro změnu velikosti a umístění prvků na formuláři nebo stránce. Když vytvoříte hybridní uživatelské rozhraní (UI), které je hostitelem ovládacích prvků Windows Forms ve WPF, WindowsFormsHost element integruje dvě schémata rozložení.
Rozdíly v rozložení mezi WPF a Windows Forms
WPF používá rozložení nezávislé na rozlišení. Všechny rozměry rozložení WPF jsou určeny pomocí pixelů nezávislých na zařízení. Zařízení-nezávislý pixel má velikost jedné devadesáté šestiny palce a je nezávislý na rozlišení, takže získáte podobné výsledky bez ohledu na to, zda vykreslujete na monitor s rozlišením 72 dpi nebo na tiskárnu s rozlišením 19 200 dpi.
WPF je také založena na dynamickém rozložení. To znamená, že prvek uživatelského rozhraní se uspořádá na formuláři nebo stránce podle jeho obsahu, nadřazeného kontejneru rozložení a dostupné velikosti obrazovky. Dynamické rozložení usnadňuje lokalizaci tím, že automaticky upravuje velikost a pozici prvků uživatelského rozhraní, když se změní délka řetězců, které obsahují.
Rozložení ve Windows Forms je závislé na zařízení a je pravděpodobnější, že bude statické. Ovládací prvky Windows Forms jsou obvykle umístěny zcela ve formuláři pomocí dimenzí zadaných v hardwarových pixelech. Windows Forms ale podporuje některé funkce dynamického rozložení, jak je shrnuto v následující tabulce.
Funkce rozložení | Popis |
---|---|
Automatické přizpůsobení velikosti | Některé ovládací prvky Windows Forms změní velikost tak, aby zobrazovaly jejich obsah správně. Další informace naleznete v tématu přehledu vlastnosti AutoSize. |
Ukotvení a dokování | Ovládací prvky Windows Forms podporují umístění a změnu velikosti na základě nadřazeného kontejneru. Další informace najdete v tématu Control.Anchor a Control.Dock. |
Automatické škálování | Ovládací prvky kontejneru a jejich potomci mění svou velikost podle rozlišení výstupního zařízení nebo velikosti výchozího písma kontejneru v pixelech. Další informace naleznete v tématu Automatické škálování ve Windows Forms. |
Kontejnery rozložení | Ovládací prvky FlowLayoutPanel a TableLayoutPanel uspořádají své podřízené ovládací prvky a přizpůsobí svoji velikost podle svého obsahu. |
Omezení rozložení
Obecně platí, že ovládací prvky Windows Forms nelze škálovat a transformovat v rozsahu možném ve WPF. Následující seznam popisuje známá omezení, když se WindowsFormsHost element pokusí integrovat hostovaný ovládací prvek Windows Forms do systému rozložení WPF.
V některých případech nelze změnit velikost ovládacích prvků Windows Forms nebo je lze nastavit pouze na konkrétní rozměry. Například ovládací prvek Windows Forms ComboBox podporuje pouze jednu výšku, která je definovaná velikostí písma ovládacího prvku. V dynamickém rozložení WPF, kde se prvky můžou roztáhnout svisle, nebude hostovaný ovládací prvek ComboBox roztažen podle očekávání.
Ovládací prvky Windows Forms nelze otočit ani zkosit. Prvek WindowsFormsHost vyvolá událost LayoutError, pokud použijete transformaci zkosení nebo rotace. Pokud nevyřešíte událost LayoutError, dojde k vyvolání InvalidOperationException.
Ve většině případů ovládací prvky Windows Forms nepodporují proporcionální škálování. Ačkoli se celkové rozměry ovládacího prvku upraví, podřízené ovládací prvky a komponenty ovládacího prvku nemusí měnit velikost tak, jak by bylo očekáváno. Toto omezení závisí na tom, jak dobře každý ovládací prvek Windows Forms podporuje škálování. Kromě toho nelze škálovat ovládací prvky Modelu Windows Forms na velikost 0 pixelů.
Ovládací prvky Windows Forms podporují automatické škálování, ve kterém formulář automaticky změní velikost samotného formuláře a jeho ovládací prvky na základě velikosti písma. V uživatelském rozhraní WPF změna velikosti písma nezmění velikost celého rozložení, i když se jednotlivé prvky můžou dynamicky měnit.
Z-pořadí
V uživatelském rozhraní WPF můžete změnit pořadí vykreslování prvků a řídit překrývající se chování. Hostovaný ovládací prvek Windows Forms je zobrazen v samostatném HWND, takže se vždy zobrazuje nad prvky WPF.
Hostovaný ovládací prvek Windows Forms je také nakreslený nad všemi Adorner prvky.
Chování rozložení
Následující části popisují konkrétní aspekty chování rozložení při hostování ovládacích prvků Windows Forms ve WPF.
Škálování, převod jednotek a nezávislost zařízení
Kdykoli WindowsFormsHost prvek provádí operace zahrnující rozměry WPF a Windows Forms, jsou zapojeny dva souřadnicové systémy: pixely nezávislé na zařízení pro WPF a hardwarové pixely pro Windows Forms. Proto je nutné použít správné převody jednotek a škálování, abyste dosáhli konzistentního rozložení.
Převod mezi souřadnicovými systémy závisí na aktuálním rozlišení zařízení a na všech transformacích rozložení nebo vykreslování použitých na prvek WindowsFormsHost nebo na nadřazené prvky.
Pokud je výstupní zařízení 96 dpi a na prvek WindowsFormsHost není použito žádné měřítko, jeden pixel nezávislý na zařízení se rovná jednomu hardwarovému pixelu.
Všechny ostatní případy vyžadují škálování souřadnicového systému. Hostovaný ovládací prvek není změněný. Místo toho se prvek WindowsFormsHost pokusí škálovat hostovaný ovládací prvek a všechny jeho podřízené ovládací prvky. Vzhledem k tomu, že Windows Forms plně nepodporuje škálování, WindowsFormsHost element se škáluje na stupeň podporovaný určitými ovládacími prvky.
Přepište metodu ScaleChild, abyste poskytli vlastní škálovací chování hostovaného ovládacího prvku Windows Forms.
Kromě škálování zpracovává prvek WindowsFormsHost případy zaokrouhlování a přetečení, jak je popsáno v následující tabulce.
Problém s převodem | Popis |
---|---|
Zaokrouhlení | Rozměry pixelů nezávislé na zařízení WPF jsou určeny jako double a rozměry hardwarových pixelů Windows Forms jsou určeny jako int . V případech, kdy jsou dimenze založené na double převedeny na dimenze založené na int , WindowsFormsHost prvek používá standardní zaokrouhlování, aby desetinné hodnoty menší než 0,5 byly zaokrouhleny dolů na 0. |
Přetečení | Když se prvek WindowsFormsHost převede z hodnot double na hodnoty int , může dojít k přetečení. Hodnoty větší než MaxValue jsou nastaveny na MaxValue. |
Vlastnosti související s rozložením
Vlastnosti, které řídí chování rozložení v ovládacích prvcích Windows Forms a elementech WPF, jsou mapovány odpovídajícím způsobem WindowsFormsHost elementem. Další informace naleznete v tématu Windows Forms a WPF Mapování vlastností.
Změny rozložení v hostovaném ovládacím prvku
Změny rozložení v hostovaném ovládacím prvku Windows Forms se přenesou do WPF, aby se spustily aktualizace rozvržení. Metoda InvalidateMeasure na WindowsFormsHost zajišťuje, že změny rozložení v hostovaném ovládacím prvku způsobí spuštění layoutového modulu WPF.
Nepřetržitá velikost ovládacích prvků Windows Forms
Ovládací prvky Windows Forms, které podporují nepřetržité škálování, plně pracují se systémem rozložení WPF. Element WindowsFormsHost používá MeasureOverride a ArrangeOverride metody jako obvykle k nastavení velikosti a uspořádání hostovaného ovládacího prvku Windows Forms.
Algoritmus určení velikosti
Element WindowsFormsHost používá následující postup k nastavení velikosti hostovaného ovládacího prvku:
Element WindowsFormsHost přepíše metody MeasureOverride a ArrangeOverride.
K určení velikosti hostovaného ovládacího prvku metoda MeasureOverride volá metodu GetPreferredSize hostovaného ovládacího prvku s omezením přeloženým z omezení předávaného metodě MeasureOverride.
Metoda ArrangeOverride se pokusí nastavit hostovaný ovládací prvek na dané omezení velikosti.
Pokud vlastnost hostovaného ovládacího prvku Size odpovídá zadanému omezení, má hostovaný ovládací prvek velikost omezení.
Pokud vlastnost Size neodpovídá zadanému omezení, hostovaný ovládací prvek nepodporuje průběžnou změnu velikosti. Například ovládací prvek MonthCalendar umožňuje pouze samostatné velikosti. Povolené velikosti tohoto ovládacího prvku se skládají z celých čísel (představující počet měsíců) pro výšku i šířku. V takových případech se element WindowsFormsHost chová takto:
Pokud vlastnost Size vrátí větší velikost než zadané omezení, prvek WindowsFormsHost ořízne hostovaný ovládací prvek. Výška a šířka se zpracovávají samostatně, takže hostovaný ovládací prvek může být oříznut v libovolném směru.
Pokud Size vlastnost vrátí menší velikost než zadané omezení, WindowsFormsHost přijme tuto hodnotu velikosti a vrátí hodnotu systému rozložení WPF.
Viz také
.NET Desktop feedback