Considerazioni sul layout per l'elemento WindowsFormsHost

In questo argomento viene descritto come l'elemento WindowsFormsHost interagisce con il sistema di layout WPF.

WPF e Windows Form supportano elementi diversi, ma simili, per ridimensionare e posizionare elementi in una maschera o in una pagina. Quando si crea un'interfaccia utente ibrida che ospita controlli Windows Form in WPF, l'elemento WindowsFormsHost integra i due schemi di layout.

Differenze di layout tra WPF e Windows Form

WPF usa un layout indipendente dalla risoluzione. Tutte le dimensioni del layout WPF vengono specificate usando pixel indipendenti dal dispositivo. Un pixel indipendente dal dispositivo è un sesto di novesimi di pollice e indipendente dalla risoluzione, quindi si ottengono risultati simili indipendentemente dal fatto che si stia eseguendo il rendering in un monitor da 72 dpi o una stampante da 19.200 dpi.

WPF si basa anche sul layout dinamico. Ciò significa che un elemento dell'interfaccia utente si dispone su una maschera o una pagina in base al contenuto, al relativo contenitore di layout padre e alle dimensioni dello schermo disponibili. Il layout dinamico facilita la localizzazione regolando automaticamente le dimensioni e la posizione degli elementi dell'interfaccia utente quando le stringhe contengono lunghezza di modifica.

Il layout in Windows Form dipende dal dispositivo e probabilmente sarà statico. In genere, i controlli Windows Form vengono posizionati in modo assoluto su una maschera usando le dimensioni specificate in pixel hardware. Tuttavia, Windows Form supporta alcune funzionalità di layout dinamico, come riepilogato nella tabella seguente.

Funzionalità layout Descrizione
Ridimensionamento automatico Alcuni controlli Windows Form ridimensionano se stessi per visualizzare correttamente il contenuto. Per altre informazioni, vedere Panoramica della proprietà AutoSize.
Ancoraggio e ancoraggio Windows Form controlli supportano il posizionamento e il ridimensionamento in base al contenitore padre. Per altre informazioni, vedere Control.Anchor e Control.Dock.
Scalabilità automatica I controlli contenitore si ridimensionano e i relativi elementi figlio in base alla risoluzione del dispositivo di output o alle dimensioni, in pixel, del tipo di carattere del contenitore predefinito. Per altre informazioni, vedere Scalabilità automatica in Windows Form.
Contenitori di layout I FlowLayoutPanel controlli e TableLayoutPanel dispongono i controlli figlio e si ridimensionano in base al relativo contenuto.

Limitazioni del layout

In generale, Windows Form controlli non possono essere ridimensionati e trasformati nella misura possibile in WPF. Nell'elenco seguente vengono descritte le limitazioni note quando l'elemento tenta di integrare il WindowsFormsHost controllo Windows Form ospitato nel sistema di layout WPF.

  • In alcuni casi, i controlli Windows Form non possono essere ridimensionati o possono essere ridimensionati solo in dimensioni specifiche. Ad esempio, un controllo Windows Form ComboBox supporta solo un'altezza singola, definita dalle dimensioni del carattere del controllo. In un layout dinamico WPF in cui gli elementi possono estendersi verticalmente, un controllo ospitato ComboBox non si estende come previsto.

  • Windows Form controlli non possono essere ruotati o asimmetrici. L'elemento WindowsFormsHost genera l'evento LayoutError se si applica una trasformazione asimmetria o rotazione. Se non si gestisce l'evento LayoutError , viene generato un oggetto InvalidOperationException .

  • Nella maggior parte dei casi, i controlli Windows Form non supportano il ridimensionamento proporzionale. Anche se le dimensioni complessive del controllo vengono ridimensionate, i controlli figlio e gli elementi componente del controllo potrebbero non venire ridimensionati come previsto. Questa limitazione dipende dal modo in cui ogni controllo Windows Form supporta il ridimensionamento. Inoltre, non è possibile ridimensionare Windows Form controlli fino a una dimensione di 0 pixel.

  • Windows Form controlli supportano la scalabilità automatica, in cui il modulo verrà ridimensionato automaticamente e i relativi controlli in base alle dimensioni del carattere. In un'interfaccia utente WPF, la modifica delle dimensioni del carattere non ridimensiona l'intero layout, anche se i singoli elementi possono essere ridimensionati in modo dinamico.

Ordine Z

In un'interfaccia utente WPF è possibile modificare l'ordine z degli elementi per controllare il comportamento sovrapposto. Un controllo Windows Form ospitato viene disegnato in un HWND separato, quindi viene sempre disegnato sopra gli elementi WPF.

Anche un controllo Windows Form ospitato viene disegnato sopra qualsiasi Adorner elemento.

Comportamento layout

Le sezioni seguenti descrivono aspetti specifici del comportamento del layout quando si ospitano controlli Windows Form in WPF.

Ridimensionamento, conversione unità e indipendenza dei dispositivi

Ogni volta che l'elemento WindowsFormsHost esegue operazioni che coinvolgono le dimensioni WPF e Windows Form, vengono coinvolti due sistemi di coordinate: pixel indipendenti dal dispositivo per WPF e pixel hardware per Windows Form. Pertanto, è necessario applicare conversioni di unità e ridimensionamento appropriate per ottenere un layout coerente.

La conversione tra i sistemi di coordinate dipende dalla risoluzione corrente del dispositivo e dalle trasformazioni di layout o rendering applicate all'elemento WindowsFormsHost o ai relativi predecessori.

Se il dispositivo di output è 96 dpi e non è stato applicato alcun ridimensionamento all'elemento WindowsFormsHost , un pixel indipendente dal dispositivo è uguale a un pixel hardware.

Tutti gli altri casi richiedono il ridimensionamento del sistema di coordinate. Il controllo ospitato non viene ridimensionato. L'elemento WindowsFormsHost tenta invece di ridimensionare il controllo ospitato e tutti i relativi controlli figlio. Poiché Windows Form non supporta completamente il ridimensionamento, l'elemento WindowsFormsHost viene ridimensionato in base al livello supportato da determinati controlli.

Eseguire l'override del ScaleChild metodo per fornire un comportamento di ridimensionamento personalizzato per il controllo Windows Form ospitato.

Oltre al ridimensionamento, l'elemento WindowsFormsHost gestisce i casi di arrotondamento e overflow, come descritto nella tabella seguente.

Problema di conversione Descrizione
Arrotondamento Le dimensioni pixel indipendenti dal dispositivo WPF vengono specificate come doublee Windows Form dimensioni pixel hardware vengono specificate come int. Nei casi in cui doublele dimensioni basate su -vengono convertite in intdimensioni basate su , l'elemento utilizza l'arrotondamento WindowsFormsHost standard, in modo che i valori frazionari inferiori a 0,5 vengano arrotondati per difetto a 0.
Overflow Quando l'elemento esegue la conversione da double valori a int valori, è possibile eseguire l'overflowWindowsFormsHost. I valori maggiori di MaxValue sono impostati su MaxValue.

Le proprietà che controllano il comportamento del layout nei controlli Windows Form e gli elementi WPF vengono mappate in modo appropriato dall'elemento WindowsFormsHost . Per altre informazioni, vedere Mapping di proprietà di Windows Form e WPF.

Modifiche al layout nel controllo ospitato

Le modifiche di layout nel controllo Windows Form ospitato vengono propagate a WPF per attivare gli aggiornamenti del layout. Il InvalidateMeasure metodo su WindowsFormsHost garantisce che le modifiche di layout nel controllo ospitato causino l'esecuzione del motore di layout WPF.

Controlli Windows Form con dimensioni continue

Windows Form controlli che supportano il ridimensionamento continuo interagiscono completamente con il sistema di layout WPF. L'elemento WindowsFormsHost usa i MeasureOverride metodi e ArrangeOverride come di consueto per ridimensionare e disporre il controllo Windows Form ospitato.

Algoritmo di ridimensionamento

L'elemento WindowsFormsHost usa la procedura seguente per ridimensionare il controllo ospitato:

  1. L'elemento esegue l'override WindowsFormsHost dei MeasureOverride metodi e ArrangeOverride .

  2. Per determinare le dimensioni del controllo ospitato, il metodo chiama il MeasureOverride metodo del GetPreferredSize controllo ospitato con un vincolo convertito dal vincolo passato al MeasureOverride metodo .

  3. Il ArrangeOverride metodo tenta di impostare il controllo ospitato sul vincolo di dimensione specificato.

  4. Se la proprietà del Size controllo ospitato corrisponde al vincolo specificato, il controllo ospitato viene ridimensionato in base al vincolo .

Se la Size proprietà non corrisponde al vincolo specificato, il controllo ospitato non supporta il ridimensionamento continuo. Ad esempio, il MonthCalendar controllo consente solo dimensioni discrete. Le dimensioni consentite per questo controllo sono costituite da numeri interi (che rappresentano il numero di mesi) per altezza e larghezza. In casi come questo, l'elemento WindowsFormsHost si comporta come segue:

  • Se la Size proprietà restituisce una dimensione maggiore del vincolo specificato, l'elemento WindowsFormsHost ritaglia il controllo ospitato. L'altezza e la larghezza vengono gestite separatamente, quindi il controllo ospitato può essere ritagliato in entrambe le direzioni.

  • Se la Size proprietà restituisce una dimensione inferiore al vincolo specificato, WindowsFormsHost accetta questo valore di dimensione e restituisce il valore al sistema di layout WPF.

Vedi anche