Layoutöverväganden för WindowsFormsHost-elementet

Det här avsnittet beskriver hur WindowsFormsHost-elementet interagerar med WPF-layoutsystemet.

WPF och Windows Forms stöder olika, men liknande, logik för storleksändring och placering av element på ett formulär eller en sida. När du skapar ett hybridanvändargränssnitt (UI) som är värd för Windows Forms-kontroller i WPF integrerar elementet WindowsFormsHost de två layoutschemana.

Skillnader i layout mellan WPF- och Windows-formulär

WPF använder lösningsoberoende layout. Alla WPF-layoutdimensioner anges med enhetsoberoende bildpunkter. En enhetsoberoende pixel är en nittiosexa av en tum i storlek och upplösningsoberoende, så du får liknande resultat oavsett om du återger till en 72-dpi-bildskärm eller en 19 200 dpi-skrivare.

WPF baseras också på dynamisk layout. Det innebär att ett gränssnittselement ordnar sig på ett formulär eller en sida enligt dess innehåll, dess överordnade layoutcontainer och den tillgängliga skärmstorleken. Dynamisk layout underlättar lokaliseringen genom att automatiskt justera storleken och positionen för gränssnittselement när strängarna de innehåller ändrar längd.

Layouten i Windows Forms är enhetsberoende och är mer sannolikt statisk. Vanligtvis placeras Windows Forms-kontroller absolut på ett formulär med hjälp av dimensioner som anges i maskinvarupixlar. Windows Forms stöder dock vissa dynamiska layoutfunktioner, som sammanfattas i följande tabell.

Layoutfunktion Beskrivning
Automatisk storleksändring Vissa Windows Forms-kontroller ändrar storlek på sig själva för att visa innehållet korrekt. För mer information, se AutoSize-egenskapsöversikt.
Förankring och dockning Windows Forms-kontroller stöder positionering och storleksändring baserat på den överordnade containern. Mer information finns i Control.Anchor och Control.Dock.
Automatisk skalning Containerkontroller ändrar storlek på sig själva och sina underordnade baserat på utdataenhetens upplösning eller storleken, i bildpunkter, på standardcontainerteckensnittet. Mer information finns i automatisk skalning i Windows Forms.
Layoutcontainrar Kontrollerna FlowLayoutPanel och TableLayoutPanel ordnar sina barnkontroller och anpassar storlek efter innehållet.

Layoutbegränsningar

I allmänhet kan Windows Forms-kontroller inte skalas och transformeras i så stor utsträckning som möjligt i WPF. I följande lista beskrivs kända begränsningar när WindowsFormsHost-elementet försöker integrera sin värdbaserade Windows Forms-kontroll i WPF-layoutsystemet.

  • I vissa fall går det inte att ändra storlek på Windows Forms-kontroller, eller så kan de bara storleksanpassas till specifika dimensioner. En Windows Forms-ComboBox-kontroll stöder till exempel bara en enda höjd, vilket definieras av kontrollens teckenstorlek. I en dynamisk WPF-layout där element kan sträcka sig lodrätt kommer en värdbaserad ComboBox kontroll inte att sträcka sig som förväntat.

  • Windows Forms-kontroller kan inte roteras eller skeva. Elementet WindowsFormsHost genererar händelsen LayoutError om du använder en skev eller rotationstransformering. Om du inte hanterar LayoutError händelsen utlöses en InvalidOperationException.

  • I de flesta fall stöder Windows Forms-kontroller inte proportionell skalning. Kontrollens övergripande dimensioner skalas, men underordnade kontroller och komponentelement i kontrollen kanske inte ändrar storlek som förväntat. Den här begränsningen beror på hur väl varje Windows Forms-kontroll stöder skalning. Dessutom kan du inte skala ned Windows Forms-kontroller till en storlek på 0 bildpunkter.

  • Windows Forms-kontroller stöder automatisk skalning, där formuläret automatiskt ändrar storlek på sig själv och dess kontroller baserat på teckenstorleken. Om du ändrar teckenstorleken i ett WPF-användargränssnitt ändras inte hela layouten, även om enskilda element kan ändra storlek dynamiskt.

Z-ordning

I ett WPF-användargränssnitt kan du ändra z-ordningen för element för att kontrollera överlappande beteende. En värdbaserad Windows Forms-kontroll ritas i en separat HWND, så den ritas alltid ovanpå WPF-element.

En värdbaserad Windows Forms-kontroll ritas också ovanpå alla Adorner element.

Layout-beteende

I följande avsnitt beskrivs specifika aspekter av layoutbeteende när du är värd för Windows Forms-kontroller i WPF.

Skalning, enhetskonvertering och enhetens oberoende

När WindowsFormsHost-elementet utför åtgärder som involverar WPF- och Windows Forms-dimensioner ingår två koordinatsystem: enhetsoberoende pixlar för WPF och maskinvarupixlar för Windows Forms. Därför måste du använda rätt enhets- och skalningskonverteringar för att uppnå en konsekvent layout.

Konverteringen mellan koordinatsystemen beror på den aktuella enhetsupplösningen och eventuella layout- eller renderingstransformeringar som tillämpas på WindowsFormsHost-elementet eller dess överordnade element.

Om utdataenheten är 96 dpi och ingen skalning har tillämpats på WindowsFormsHost-elementet är en enhetsoberoende pixel lika med en maskinvarupixel.

Alla andra fall kräver koordinatsystemskalning. Den värdbaserade kontrollen har inte storleksändrats. I stället försöker WindowsFormsHost-elementet skala värdkontrollen och alla dess underordnade kontroller. Eftersom Windows Forms inte har fullt stöd för skalning skalas WindowsFormsHost-elementet i den grad som stöds av vissa kontroller.

Åsidosätt metoden ScaleChild för att tillhandahålla anpassat skalningsbeteende för den värdbaserade Windows Forms-kontrollen.

Förutom skalning hanterar WindowsFormsHost-elementet avrundnings- och spillfall enligt beskrivningen i följande tabell.

Konverteringsproblem Beskrivning
Avrundning WPF-enhetsoberoende pixeldimensioner anges som doubleoch Windows Forms maskinvarupixeldimensioner anges som int. I fall där double-baserade dimensioner konverteras till int-baserade dimensioner använder WindowsFormsHost-elementet standardrundning, så att bråkvärden som är mindre än 0,5 avrundas ned till 0.
Överflöde När elementet WindowsFormsHost konverteras från double värden till int värden är spill möjligt. Värden som är större än MaxValue anges till MaxValue.

Egenskaper som styr layoutbeteendet i Windows Forms-kontroller och WPF-element mappas korrekt av WindowsFormsHost-elementet. Mer information finns i Windows Forms and WPF Property Mapping.

Layoutändringar i den värdbaserade kontrollen

Layoutändringar i den värdbaserade Windows Forms-kontrollen sprids till WPF för att utlösa layoutuppdateringar. Metoden InvalidateMeasureWindowsFormsHost ser till att layoutändringar i den värdbaserade kontrollen gör att WPF-layoutmotorn körs.

Windows Forms-kontroller med kontinuerlig storlek

Windows Forms-kontroller som stöder kontinuerlig skalning interagerar helt med WPF-layoutsystemet. Elementet WindowsFormsHost använder metoderna MeasureOverride och ArrangeOverride som vanligt för att storleksanpassa och ordna den värdbaserade Windows Forms-kontrollen.

Storleksalgoritm

Elementet WindowsFormsHost använder följande procedur för att storleksanpassa den värdbaserade kontrollen:

  1. Elementet WindowsFormsHost åsidosätter metoderna MeasureOverride och ArrangeOverride.

  2. För att fastställa storleken på den värdbaserade kontrollen anropar metoden MeasureOverride den värdbaserade kontrollens GetPreferredSize-metod med en begränsning som översätts från villkoret som skickas till metoden MeasureOverride.

  3. Metoden ArrangeOverride försöker ange den värdbaserade kontrollen till den angivna storleksbegränsningen.

  4. Om den värdbaserade kontrollens egenskap Size matchar den angivna begränsningen, är den värdbaserade kontrollen storleksanpassad till villkoret.

Om egenskapen Size inte matchar den angivna begränsningen stöder den värdbaserade kontrollen inte kontinuerlig storleksändring. Till exempel tillåter MonthCalendar-kontrollen endast diskreta storlekar. De tillåtna storlekarna för den här kontrollen består av heltal (som representerar antalet månader) för både höjd och bredd. I sådana här fall beter sig WindowsFormsHost-elementet på följande sätt:

  • Om egenskapen Size returnerar en större storlek än den angivna begränsningen klipper WindowsFormsHost elementet den värdbaserade kontrollen. Höjd och bredd hanteras separat, så den värdbaserade kontrollen kan klipps ur i båda riktningarna.

  • Om egenskapen Size returnerar en mindre storlek än den angivna begränsningen accepterar WindowsFormsHost det här storleksvärdet och returnerar värdet till WPF-layoutsystemet.

Se även