Condividi tramite


Considerazioni sul layout per l'elemento WindowsFormsHost

In questo argomento viene illustrata la modalità di interazione dell'elemento WindowsFormsHost con il sistema di layout di WPF.

WPF e Windows Forms supportano una logica diversa, benché analoga, per il ridimensionamento e il posizionamento degli elementi in un form o in una pagina. Quando si crea un'interfaccia utente ibrida che ospita controlli Windows Forms in WPF, l'elemento WindowsFormsHost integra i due schemi di layout.

Differenze di layout tra WPF e Windows Form

WPF utilizza il layout indipendente dalla risoluzione. Tutte le dimensioni di layout di WPF vengono specificate tramite pixel indipendenti dal dispositivo. Un pixel indipendente dal dispositivo ha le dimensioni di un novantaseiesimo di pollice ed è indipendente dalla risoluzione, pertanto si ottengono risultati simili indipendentemente dal fatto che si esegua il rendering su un monitor a 72 dpi o su una stampante a 19.200 dpi.

WPF si basa inoltre sul layout dinamico. In questo modo, la disposizione di un elemento dell'interfaccia utente su un form o una pagina avviene in base al contenuto, al contenitore di layout padre e alla dimensione dello schermo disponibile. Con il layout dinamico il posizionamento è più semplice grazie alla regolazione automatica della dimensione e della posizione degli elementi dell'interfaccia utente nel momento in cui viene modificata la lunghezza delle stringhe che contengono.

Il layout in Windows Forms è dipendente dal dispositivo e generalmente statico. In genere, i controlli Windows Forms vengono posizionati in modo assoluto su un form tramite dimensioni specificate in pixel hardware. Windows Forms, tuttavia, supporta alcune funzionalità di layout dinamiche, come riepilogato nella tabella riportata di seguito.

Funzionalità di layout

Descrizione

Ridimensionamento automatico

Alcuni controlli Windows Forms vengono ridimensionati automaticamente per visualizzare correttamente il contenuto. Per ulteriori informazioni, vedere Cenni preliminari sulla proprietà AutoSize.

Ancoraggio

I controlli Windows Forms supportano il posizionamento e il ridimensionamento in base al contenitore padre. Per ulteriori informazioni, vedere Control.Anchor e Control.Dock.

Ridimensionamento automatico

Controlli contenitore e relativi figli vengono ridimensionati automaticamente in base alla risoluzione del dispositivo di output o della dimensione, nei pixel, del tipo di carattere del contenitore predefinito. Per ulteriori informazioni, vedere Ridimensionamento automatico in Windows Form.

Contenitori layout

I controlli FlowLayoutPanel e TableLayoutPanel dispongono i controlli figlio e si ridimensionano in base al contenuto.

Limitazioni del layout

In genere, non è possibile ridimensionare e trasformare i controlli Windows Forms nella misura possibile in WPF. Nell'elenco riportato di seguito vengono descritte le limitazioni note quando l'elemento WindowsFormsHost tenta di integrare il controllo Windows Forms ospitato nel sistema di layout WPF.

  • In alcuni casi non è possibile ridimensionare i controlli Windows Forms oppure è possibile ridimensionarli solo in base a dimensioni specifiche. Ad esempio, un controllo Windows Forms ComboBox supporta una sola altezza definita dalla dimensione del carattere del controllo. In un layout dinamico di WPF in cui è possibile allungare gli elementi in verticale, un controllo ComboBox ospitato non verrà allungato nel modo previsto.

  • Non è possibile ruotare o inclinare i controlli Windows Forms. L'elemento WindowsFormsHost genera l'evento LayoutError se si applica una trasformazione di inclinazione o rotazione. Se non si gestisce l'evento LayoutError, viene generato un oggetto InvalidOperationException.

  • Nella maggior parte dei casi, i controlli Windows Forms non supportano il ridimensionamento proporzionale. Anche se le dimensioni complessive del controllo vengono ridimensionate, i controlli figlio e gli elementi componente del controllo non possono essere ridimensionati nel modo previsto. Questa limitazione dipende dalla modalità in cui ogni controllo Windows Forms supporta il ridimensionamento. In aggiunta, non è possibile ridimensionare i controlli Windows Forms fino a una dimensione di 0 pixel.

  • I controlli Windows Forms supportano il ridimensionamento automatico in cui il form e i relativi controlli vengono automaticamente ridimensionati in base alla dimensione del carattere. In un'interfaccia utente di WPF la modifica della dimensione del carattere non causa il ridimensionamento dell'intero layout, benché sia possibile che vengano ridimensionati singoli elementi.

Ordine Z

In un'interfaccia utente di WPF è possibile modificare l'ordine z degli elementi per controllare il comportamento di sovrapposizione. Un controllo Windows Forms ospitato viene disegnato in un elemento HWND separato, in modo che venga disegnato sempre sopra elementi WPF.

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

Comportamento di layout

Nelle sezioni riportate di seguito vengono descritti aspetti specifici del comportamento di layout quando i controlli Windows Forms vengono ospitati in WPF.

Ridimensionamento, conversione di unità e indipendenza dal dispositivo

Le operazioni eseguite mediante l'elemento WindowsFormsHost che implicano dimensioni WPF e Windows Forms interessano due sistemi di coordinate: pixel indipendenti dal dispositivo per WPF e pixel hardware per Windows Forms. È pertanto necessario applicare le corrette conversioni di unità e ridimensionamento per ottenere un layout coerente.

La conversione tra sistemi di coordinate dipende dalla risoluzione del dispositivo corrente e da qualsiasi trasformazione di layout o rendering applicata all'elemento WindowsFormsHost o ai relativi predecessori.

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

Tutti gli altri casi richiedono il ridimensionamento del sistema di coordinate. Il controllo ospitato non viene ridimensionato. Al contrario, l'elemento WindowsFormsHost tenta di ridimensionare il controllo ospitato e tutti i relativi controlli figlio. Poiché Windows Forms non offre il supporto completo del ridimensionamento, l'elemento WindowsFormsHost viene ridimensionato secondo il grado supportato da determinati controlli.

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

In aggiunta al ridimensionamento, l'elemento WindowsFormsHost gestisce casi di arrotondamento e overflow come illustrato nella tabella riportata di seguito.

Problema di conversione

Descrizione

Arrotondamento

Le dimensioni dei pixel indipendenti dal dispositivo di WPF sono specificate come double e le dimensioni dei pixel hardware di Windows Forms sono specificate come int. Nei casi in cui le dimensioni basate su double vengono convertite in dimensioni basate su int, l'elemento WindowsFormsHost utilizza l'arrotondamento standard, in modo che i valori frazionari minori di 0,5 siano arrotondati per difetto a 0.

Overflow

Quando viene eseguita la conversione di valori double in valori int tramite l'elemento WindowsFormsHost, è possibile l'overflow. I valori maggiori di MaxValue vengono impostati su MaxValue.

Proprietà relative al layout

Le proprietà che controllano il comportamento di layout nei controlli Windows Forms e negli elementi WPF sono mappate in modo appropriato dall'elemento WindowsFormsHost. Per ulteriori informazioni, vedere Mapping di proprietà di Windows Form e WPF.

Modifiche del layout nel controllo ospitato

Le modifiche del layout nel controllo Windows Forms ospitato vengono propagate a WPF per avviare gli aggiornamenti del layout. Il metodo InvalidateMeasure in WindowsFormsHost garantisce che le modifiche del layout nel controllo ospitato attivino l'esecuzione del motore di layout di WPF.

Controlli Windows Form con ridimensionamento continuo

I controlli Windows Forms che supportano il ridimensionamento continuo interagiscono in modo completo con il sistema di layout di WPF. L'elemento WindowsFormsHost utilizza i metodi MeasureOverride e ArrangeOverride nel modo consueto per ridimensionare e disporre il controllo Windows Forms ospitato.

Algoritmo di ridimensionamento

La procedura descritta di seguito viene utilizzata dall'elemento WindowsFormsHost per ridimensionare il controllo ospitato:

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

  2. Per determinare la dimensione 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. Il controllo MonthCalendar, ad esempio, consente unicamente dimensioni discrete. Le dimensioni consentite per tale controllo sono costituite da numeri interi (che rappresentano il numero dei mesi) per l'altezza e per la larghezza. In casi come questo, l'elemento WindowsFormsHost si comporta nel modo seguente:

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

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

Vedere anche

Attività

Procedura dettagliata: disposizione di controlli Windows Form in WPF

Riferimenti

ElementHost

WindowsFormsHost

Concetti

Mapping di proprietà di Windows Form e WPF

Altre risorse

Esempio di disposizione di controlli Windows Form in WPF

Migrazione e interoperabilità