Condividi tramite


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 Forms supportano logiche diverse, ma simili, per il ridimensionamento e il posizionamento degli elementi in una maschera o in una pagina. Quando si crea un'interfaccia utente ibrida che ospita i controlli Windows Form in WPF, l'elemento WindowsFormsHost integra i due schemi di layout.

Differenze nel 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 è basato anche su layout dinamico. Ciò significa che un elemento dell'interfaccia utente si dispone su un modulo o una pagina in base al suo contenuto, al contenitore di layout padre e alle dimensioni disponibili dello schermo. Il layout dinamico facilita la localizzazione regolando automaticamente la dimensione e la posizione degli elementi dell'interfaccia utente quando la lunghezza delle stringhe cambia.

Il layout in Windows Form dipende dal dispositivo e probabilmente sarà statico. In genere, i controlli di Windows Forms vengono posizionati in modo assoluto su un form utilizzando dimensioni specificate in pixel hardware. Windows Form supporta tuttavia alcune funzionalità di layout dinamico, come riepilogato nella tabella seguente.

Funzionalità di layout Descrizione
Ridimensionamento automatico Alcuni controlli Windows Form si ridimensionano per visualizzarne correttamente il contenuto. Per altre informazioni, vedere Panoramica della proprietà AutoSize.
Ancoraggio e ormeggio I controlli Windows Form 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 loro elementi figli in base alla risoluzione del dispositivo di output o alle dimensioni del tipo di carattere predefinito del contenitore, in pixel. Per altre informazioni, vedere Ridimensionamento Automatico nelle Windows Forms.
Contenitori di layout I controlli FlowLayoutPanel e TableLayoutPanel dispongono i controlli figlio e si ridimensionano in base ai loro contenuti.

Limitazioni del layout

In generale, i controlli Windows Form non possono essere ridimensionati e trasformati nella misura possibile in WPF. Nell'elenco seguente vengono descritte le limitazioni note quando l'elemento WindowsFormsHost tenta di integrare il 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 ComboBox ospitato non si estende come previsto.

  • I controlli Windows Form non possono essere ruotati o deformati. L'elemento WindowsFormsHost genera l'evento LayoutError se si applica una trasformazione di inclinazione o rotazione. Se non gestisci l'evento LayoutError, viene generato un InvalidOperationException.

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

  • I controlli Windows Form 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 Forms ospitato viene disegnato in un HWND separato, quindi appare sempre sopra gli elementi WPF.

Viene inoltre disegnato un controllo Windows Forms ospitato sopra tutti gli elementi Adorner.

Comportamento del 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 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 metodo ScaleChild 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 le dimensioni dei pixel hardware di Windows Form vengono specificate come int. Nei casi in cui le dimensioni basate su doublevengono convertite in dimensioni basate su int, l'elemento WindowsFormsHost utilizza l'arrotondamento standard, in modo che i valori frazionari inferiori a 0,5 vengano arrotondati per difetto a 0.
Traboccare Quando l'elemento WindowsFormsHost esegue la conversione da valori double a valori int, è possibile eseguire l'overflow. I valori maggiori di MaxValue sono impostati su MaxValue.

Le proprietà che controllano il comportamento del layout nei controlli Windows Form e negli elementi WPF vengono mappate in modo appropriato dall'elemento WindowsFormsHost. Per ulteriori informazioni, vedere Windows Forms e mappatura delle proprietà 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 metodo InvalidateMeasure su WindowsFormsHost garantisce che le modifiche al layout nel controllo ospitato causino l'attivazione del motore di layout WPF.

Controlli Windows Forms a dimensionamento continuo

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

Algoritmo di dimensionamento

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

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

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

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

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

Se la proprietà Size non corrisponde al vincolo specificato, il controllo ospitato non supporta il ridimensionamento continuo. Ad esempio, il controllo MonthCalendar 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 proprietà Size restituisce una dimensione maggiore del vincolo specificato, l'elemento WindowsFormsHost taglia il controllo ospitato. Altezza e larghezza sono gestite separatamente, quindi il controllo ospitato potrebbe essere ritagliato in uno dei due orientamenti.

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

Vedere anche