Risoluzione dei problemi relativi ad applicazioni ibride

Questo argomento elenca alcuni problemi comuni che possono verificarsi durante la creazione di applicazioni ibride, che usano tecnologie WPF e Windows Form.

Sovrapposizione di controlli

I controlli potrebbero sovrapporsi in maniera imprevista. Windows Form usa un HWND separato per ogni controllo. WPF usa un HWND per tutto il contenuto di una pagina. Questa differenza di implementazione provoca comportamenti di sovrapposizione imprevisti.

Un controllo Windows Form ospitato in WPF viene sempre visualizzato sopra il contenuto WPF.

Il contenuto WPF ospitato in un ElementHost controllo viene visualizzato nell'ordine z del ElementHost controllo. È possibile sovrapporsi ElementHost ai controlli, ma il contenuto WPF ospitato non combina o interagisce.

Child Property

Le WindowsFormsHost classi e ElementHost possono ospitare solo un singolo controllo o elemento figlio. Per ospitarne più di uno, è necessario usare un contenitore come contenuto figlio. Ad esempio, è possibile aggiungere Windows Form pulsante e controlli casella di controllo a un System.Windows.Forms.Panel controllo e quindi assegnare il pannello alla proprietà di Child un WindowsFormsHost controllo. Tuttavia, non è possibile aggiungere separatamente i controlli pulsante e casella di controllo allo stesso WindowsFormsHost controllo.

Scalabilità

WPF e Windows Form hanno modelli di scalabilità diversi. Alcune trasformazioni di ridimensionamento WPF sono significative per Windows Form controlli, ma altri non lo sono. Ad esempio, il ridimensionamento di un controllo Windows Form su 0 funzionerà, ma se si tenta di ridimensionare lo stesso controllo a un valore diverso da zero, la dimensione del controllo rimane 0. Per altre informazioni, vedere Considerazioni sul layout per l'elemento WindowsFormsHost.

Adapter

Durante il funzionamento delle WindowsFormsHost classi e ElementHost può verificarsi confusione, perché includono un contenitore nascosto. Entrambe le WindowsFormsHost classi e ElementHost hanno un contenitore nascosto, denominato adapter, che usano per ospitare il contenuto. Per l'elemento, l'adattatore WindowsFormsHost deriva dalla System.Windows.Forms.ContainerControl classe . Per il ElementHost controllo, l'adattatore deriva dall'elemento DockPanel . I riferimenti all'adattatore presenti in altri argomenti sull'interoperabilità alludono a tale contenitore.

Annidamento

L'annidamento di un WindowsFormsHost elemento all'interno di un ElementHost controllo non è supportato. Anche l'annidamento di un ElementHost controllo all'interno di un WindowsFormsHost elemento non è supportato.

Focus

Lo stato attivo funziona in modo diverso in WPF e Windows Form, il che significa che i problemi di stato attivo possono verificarsi in un'applicazione ibrida. Ad esempio, se si ha lo stato attivo all'interno di un WindowsFormsHost elemento e si riduce a icona e si ripristina la pagina o si visualizza una finestra di dialogo modale, lo stato attivo all'interno dell'elemento WindowsFormsHost potrebbe andarsi perso. L'elemento WindowsFormsHost ha ancora lo stato attivo, ma il controllo al suo interno potrebbe non essere attivo.

Lo stato attivo influisce anche sulla convalida dei dati. La convalida funziona in un WindowsFormsHost elemento, ma non funziona quando si estrae dall'elemento WindowsFormsHost o tra due elementi diversi WindowsFormsHost .

Mapping delle proprietà

Alcuni mapping delle proprietà richiedono un'interpretazione approfondita per colmare implementazioni diverse tra WPF e le tecnologie Windows Form. I mapping di proprietà consentono al codice di rispondere alle modifiche apportate ai tipi di carattere, ai colori e ad altre proprietà. In generale, i mapping di proprietà funzionano rimanendo in ascolto di eventi PropertyChanged o chiamate OnPropertyChanged e impostando le proprietà adeguate sul controllo figlio o sul relativo adattatore. Per altre informazioni, vedere Mapping di proprietà di Windows Form e WPF.

Quando viene assegnata la WindowsFormsHost.Child proprietà o ElementHost.Child , vengono impostate automaticamente diverse proprietà correlate al layout sul contenuto ospitato. La modifica di queste proprietà di contenuto può determinare comportamenti di layout imprevisti.

Il contenuto ospitato è ancorato per riempire e WindowsFormsHostElementHost padre. Per abilitare questo comportamento di riempimento, durante l'impostazione della proprietà figlio vengono impostate varie proprietà. Nella tabella seguente sono elencate le ElementHost proprietà del contenuto impostate dalle classi e WindowsFormsHost .

Classe host Proprietà di contenuto
ElementHost Height

Width

Margin

VerticalAlignment

HorizontalAlignment
WindowsFormsHost Margin

Dock

AutoSize

Location

MaximumSize

Non impostare queste proprietà direttamente sul contenuto ospitato. Per altre informazioni, vedere Considerazioni sul layout per l'elemento WindowsFormsHost.

Le applicazioni di navigazione potrebbero non mantenere lo stato dell'utente. L'elemento WindowsFormsHost ricrea i controlli quando viene usato in un'applicazione di navigazione. La ricreazione dei controlli figlio si verifica quando l'utente si allontana dalla pagina che ospita l'elemento WindowsFormsHost e quindi torna a esso. Qualsiasi contenuto digitato dall'utente andrà perduto.

Interoperabilità del ciclo di messaggi

Quando si utilizzano cicli di messaggi Windows Form, è possibile che i messaggi non vengano elaborati come previsto. Il EnableWindowsFormsInterop metodo viene chiamato dal WindowsFormsHost costruttore . Questo metodo aggiunge un filtro di messaggio al ciclo di messaggi WPF. Questo filtro chiama il Control.PreProcessMessage metodo se è System.Windows.Forms.Control la destinazione del messaggio e converte/invia il messaggio.

Se viene visualizzato un Window oggetto in un ciclo di messaggi Windows Form con Application.Run, non è possibile digitare nulla a meno che non si chiami il EnableModelessKeyboardInterop metodo . Il EnableModelessKeyboardInterop metodo accetta e Window aggiunge un System.Windows.Forms.IMessageFilteroggetto , che reindirizza i messaggi correlati alla chiave al ciclo di messaggi WPF. Per altre informazioni, vedere Architettura di input per l'interoperabilità tra Windows Form e WPF.

Opacità e sovrapposizione

La HwndHost classe non supporta il layering. Ciò significa che l'impostazione della Opacity proprietà sull'elemento WindowsFormsHost non ha alcun effetto e non si verificherà alcuna fusione con altre finestre WPF impostate AllowsTransparency su true.

Dispose

L'eliminazione non corretta delle classi può determinare una perdita di risorse. Nelle applicazioni ibride assicurarsi che le WindowsFormsHost classi e ElementHost vengano eliminate o che si verifichino perdite di risorse. Windows Form elimina i ElementHost controlli quando il padre non modale Form viene chiuso. WPF elimina gli WindowsFormsHost elementi quando l'applicazione viene arrestata. È possibile visualizzare un WindowsFormsHost elemento in un Window in un ciclo di messaggi Windows Form. In questo caso, è possibile che il codice non riceva notifica della chiusura dell'applicazione.

Enabling Visual Styles (Abilitazione degli stili di visualizzazione)

Gli stili di visualizzazione di Microsoft Windows XP in un controllo Windows Form potrebbero non essere abilitati. Il Application.EnableVisualStyles metodo viene chiamato nel modello per un'applicazione Windows Form. Anche se questo metodo non viene chiamato per impostazione predefinita, se si usa Visual Studio per creare un progetto, si otterranno gli stili di visualizzazione di Microsoft Windows XP per i controlli, se è disponibile la versione 6.0 di Comctl32.dll. È necessario chiamare il metodo prima che EnableVisualStyles gli handle vengano creati nel thread. Per altre informazioni, vedere Procedura: Abilitare stili di visualizzazione in un'applicazione ibrida.

Controlli con licenza

I controlli Windows Form concessi in licenza che visualizzano le informazioni sulle licenze in una finestra di messaggio all'utente potrebbero causare comportamenti imprevisti per un'applicazione ibrida. Alcuni controlli con licenza visualizzano una finestra di dialogo in risposta alla creazione di handle. Ad esempio, un controllo con licenza potrebbe informare l'utente che è richiesta una licenza oppure che sono consentiti ancora tre usi del controllo a scopo di valutazione.

L'elemento WindowsFormsHost deriva dalla HwndHost classe e l'handle del controllo figlio viene creato all'interno del BuildWindowCore metodo . La HwndHost classe non consente l'elaborazione dei messaggi nel BuildWindowCore metodo , ma la visualizzazione di una finestra di dialogo determina l'invio dei messaggi. Per abilitare questo scenario di licenza, chiamare il Control.CreateControl metodo sul controllo prima di assegnarlo come WindowsFormsHost figlio dell'elemento.

WPF Designer

È possibile progettare il contenuto WPF usando WPF Designer per Visual Studio. Le sezioni seguenti elencano alcuni problemi comuni che possono verificarsi durante la creazione di applicazioni ibride con WPF Designer.

Proprietà BackColorTransparent ignorata in fase di progettazione

La BackColorTransparent proprietà potrebbe non funzionare come previsto in fase di progettazione.

Se un controllo WPF non si trova in un elemento padre visibile, il runtime WPF ignora il BackColorTransparent valore. Il motivo per cui BackColorTransparent potrebbe essere ignorato è perché ElementHost l'oggetto viene creato in un oggetto separato AppDomain. Tuttavia, quando si esegue l'applicazione, BackColorTransparent funziona come previsto.

Visualizzazione dell'elenco errori della fase di progettazione quando viene eliminata la cartella obj

Se la cartella obj viene eliminata, viene visualizzato l'elenco errori della fase di progettazione.

Quando si progetta usando ElementHost, la finestra di progettazione di Windows Form usa i file generati nella cartella Debug o Release all'interno della cartella obj del progetto. Se si eliminano questi file, viene visualizzato l'elenco errori della fase di progettazione. Per risolvere questo problema, ricompilare il progetto. Per altre informazioni, vedere Errori in fase di progettazione in Progettazione Windows Form.

ElementHost e IME

I controlli WPF ospitati in un ElementHost oggetto attualmente non supportano la ImeMode proprietà . Le modifiche apportate a ImeMode verranno ignorate dai controlli ospitati.

Vedi anche