Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Aggiornamento: novembre 2007
In questo argomento vengono elencati alcuni problemi comuni che possono verificarsi durante la creazione di applicazioni che utilizzano tecnologie sia WPF, sia Windows Form.
Sovrapposizione di controlli
È possibile che i controlli non si sovrappongano come previsto. Windows Form utilizza un elemento HWND distinto per ciascun controllo. WPF utilizza un unico elemento 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 visualizzato sempre al di sopra del contenuto WPF.
Il contenuto WPF ospitato in un controllo ElementHost viene visualizzato in corrispondenza dell'ordine Z del controllo ElementHost. È possibile far coincidere i controlli ElementHost, ma il contenuto WPF ospitato non consente la combinazione o l'interazione.
Proprietà Child
Le classi WindowsFormsHost e ElementHost possono ospitare solo un singolo controllo o elemento figlio. Per ospitarne più di uno, è necessario utilizzare un contenitore come contenuto figlio. Ad esempio, è possibile aggiungere controlli pulsante e casella di controllo Windows Form in un controllo System.Windows.Forms.Panel e assegnare quindi il pannello a una proprietà Child del controllo WindowsFormsHost. Tuttavia, non è possibile aggiungere controlli quali caselle di controllo e pulsanti separatamente allo stesso controllo WindowsFormsHost.
Ridimensionamento
In WPF e Windows Form sono disponibili modelli di ridimensionamento diversi. Alcune trasformazioni di ridimensionamento WPF hanno valore per i controlli Windows Form, ma non tutte. Ad esempio, è possibile ridimensionare un controllo Windows Form fino a 0, ma se si tenta di riportare lo stesso controllo su un valore di ridimensionamento diverso da 0, le dimensioni del controllo rimarranno invariate. Per ulteriori informazioni, vedere Considerazioni sul layout per l'elemento WindowsFormsHost.
Adattatore
L'utilizzo delle classi WindowsFormsHost e ElementHost può creare confusione, perché tali classi includono un contenitore nascosto. Entrambe le classi WindowsFormsHost e ElementHost dispongono di un contenitore nascosto, chiamatoadattatore e utilizzato per ospitare il contenuto. Per l'elemento WindowsFormsHost, l'adattatore deriva dalla classe System.Windows.Forms.ContainerControl. Per il controllo ElementHost, l'adattatore deriva dall'elemento DockPanel. I riferimenti all'adattatore presenti in altri argomenti sull'interoperabilità alludono a tale contenitore.
Nidificazione
La nidificazione di un elemento WindowsFormsHost all'interno di un controllo ElementHost non è supportata. Parimenti, non è supportata la nidificazione di un controllo ElementHost all'interno di un elemento WindowsFormsHost.
Focus
Lo stato attivo funziona in maniera diversa in WPF e Windows Form; pertanto, in un'applicazione ibrida possono verificarsi dei problemi in relazione allo stato attivo. Ad esempio, se in un elementoWindowsFormsHost è impostato lo stato attivo, una riduzione a icona o un ripristino della pagina oppure la visualizzazione di una finestra di dialogo modale potrebbero determinare la perdita dello stato attivo all'interno dell'elemento WindowsFormsHost. L'elemento WindowsFormsHost ha ancora lo stato attivo, ma il controllo all'interno lo ha perso.
Lo stato attivo influisce anche sulla convalida dati. La convalida funziona all'interno di un elemento WindowsFormsHost, ma non quando si esce dall'elemento WindowsFormsHost, né tra due elementi WindowsFormsHost diversi.
Mapping di proprietà
Alcuni mapping di proprietà richiedono un'interpretazione estensiva per integrare differenti implementazioni tra le tecnologie WPF e 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 ulteriori informazioni, vedere Mapping di proprietà di Windows Form e WPF.
Proprietà relative al layout nel contenuto ospitato
Quando viene assegnata la proprietà WindowsFormsHost.Child o ElementHost.Child, diverse proprietà del contenuto ospitato relative al layout vengono impostate automaticamente. La modifica di queste proprietà di contenuto può determinare comportamenti di layout imprevisti.
Il contenuto ospitato è ancorato in modo da riempire gli elementi padre WindowsFormsHost e ElementHost. Al fine di attivare tale comportamento di riempimento, durante l'impostazione della proprietà figlio vengono impostate varie proprietà. Nella tabella seguente sono indicate le proprietà del contenuto impostate dalle classi ElementHost e WindowsFormsHost.
Classe host |
Proprietà di contenuto |
|---|---|
Non impostare queste proprietà direttamente nel contenuto ospitato. Per ulteriori informazioni, vedere Considerazioni sul layout per l'elemento WindowsFormsHost.
Applicazioni per l'esplorazione
Talvolta le applicazioni per l'esplorazione non garantiscono che lo stato dell'utente sarà mantenuto. L'elemento WindowsFormsHost ricrea i propri controlli se utilizzato in un'applicazione per l'esplorazione. I controlli figlio vengono ricreati quando l'utente si sposta dalla pagina che ospita l'elemento WindowsFormsHost e vi ritorna in un secondo momento. Qualsiasi contenuto immesso dall'utente andrà perduto.
Interoperabilità del ciclo di messaggi
I messaggi potrebbero essere elaborati in maniera diversa da quella prevista , quando si utilizzano i relativi cicli Windows Form. Il metodo EnableWindowsFormsInterop viene chiamato dal costruttore WindowsFormsHost. Tale metodo aggiunge un filtro messaggi al ciclo di messaggi WPF. Questo filtro chiama il metodo Control.PreProcessMessage nel caso in cui la destinazione del messaggio fosse System.Windows.Forms.Control e quindi converte e invia il messaggio.
Se si visualizza un oggetto Window in un ciclo di messaggi Windows Form con Application.Run, sarà impossibile digitare qualsiasi carattere a meno che non si chiami il metodo EnableModelessKeyboardInterop. Il metodo EnableModelessKeyboardInterop accetta Window e aggiunge un oggetto System.Windows.Forms.IMessageFilter che reindirizza i messaggi relativi alla chiave al ciclo di messaggi WPF. Per ulteriori informazioni, vedere Architettura di input per l'interoperabilità tra Windows Form e WPF.
Opacità e sovrapposizione
La classe HwndHost non supporta la sovrapposizione. Pertanto, l'impostazione della proprietà Opacity dell'elemento WindowsFormsHost non avrà effetto e non ci sarà fusione con altre finestre WPF in cui AllowsTransparency è impostato su true.
Dispose
Un'eliminazione non corretta delle classi può determinare una perdita di risorse. Nelle applicazioni ibride, verificare che le classi WindowsFormsHost e ElementHost siano state eliminate, per evitare perdite di risorse. In Windows Form i controlli ElementHost vengono eliminati alla chiusura del relativo elemento padre Form non modale. In WPF gli elementi WindowsFormsHost vengono eliminati alla chiusura dell'applicazione. È possibile visualizzare un elemento WindowsFormsHost di un oggetto Window in un ciclo di messaggi Windows Form. In questo caso, è possibile che il codice non riceva notifica della chiusura dell'applicazione.
Attivazione degli stili visivi
Gli stili visivi Microsoft Windows XP di un controllo Windows Form possono non essere attivi. Il metodo Application.EnableVisualStyles viene chiamato nel modello per un'applicazione Windows Form. Sebbene la chiamata a questo metodo non sia impostata in modalità predefinita, utilizzando Visual Studio per la creazione di un progetto, saranno restituiti gli stili visivi Microsoft Windows XP per i controlli, se è disponibile la versione 6.0 di Comctl32.dll. È necessario chiamare il metodo EnableVisualStyles prima che sul thread vengano creati handle. Per ulteriori informazioni, vedere Procedura: attivare stili di visualizzazione in un'applicazione ibrida.
Controlli con licenza
I controlli Windows Form con licenza che consentono all'utente di visualizzare in una finestra di messaggio le informazioni relative alla licenza potrebbero determinare comportamenti imprevisti in un'applicazione ibrida. Per alcuni controlli con licenza viene visualizzata una finestra di dialogo in seguito alla creazione di handle. Ad esempio, un controllo con licenza potrebbe inviare una segnalazione all'utente quando è richiesta una licenza oppure quando sono consentiti ancora tre utilizzi del controllo a scopo di valutazione.
L'elemento WindowsFormsHost deriva dalla classe HwndHost e l'handle del controllo figlio viene creato all'interno del metodo BuildWindowCore. La classe HwndHost non consente l'elaborazione di messaggi nel metodo BuildWindowCore; tuttavia, la visualizzazione di una finestra di messaggio determina l'invio dei messaggi. Per attivare questo scenario di gestione delle licenze, chiamare il metodo Control.CreateControl del controllo prima di assegnarlo come elemento figlio WindowsFormsHost dell'elemento.
Progettazione WPF
È possibile progettare contenuto WPF utilizzando Progettazione Windows Presentation Foundation (WPF) per Visual Studio. Nelle sezioni seguenti sono riportati alcuni problemi comuni che possono verificarsi durante la creazione di applicazioni ibride con WPF Designer.
Proprietà BackColorTransparent ignorata in fase di progettazione
La proprietà BackColorTransparent potrebbe non funzionare come previsto in fase di progettazione.
Se un controllo WPF non si trova su un elemento padre visibile, il runtime WPF ignora il valore di BackColorTransparent. La proprietà BackColorTransparent potrebbe essere ignorata perché l'oggetto ElementHost viene creato in un oggetto AppDomain distinto. Tuttavia, quando si esegue l'applicazione, BackColorTransparent funziona come previsto.
Visualizzazione dell'elenco errori in fase di progettazione quando viene eliminata la cartella obj
Se la cartella obj viene eliminata, viene visualizzato l'elenco errori in fase di progettazione.
Quando si progetta utilizzando ElementHost, in Progettazione Windows Form vengono utilizzati file generati nella cartella Debug o Release all'interno della cartella obj del progetto. Se tali file vengono eliminati, verrà visualizzato l'elenco errori in fase di progettazione. Per risolvere questo problema, ricompilare il progetto. Per ulteriori informazioni, vedere Errori in fase di progettazione in Progettazione Windows Form.
ElementHost e IME
I controlli WPF contenuti in un oggetto ElementHost attualmente non supportano la proprietà ImeMode. Le modifiche apportate a ImeMode verranno ignorate dai controlli contenuti.
Vedere anche
Attività
Procedura: attivare stili di visualizzazione in un'applicazione ibrida
Concetti
Architettura di input per l'interoperabilità tra Windows Form e WPF
Considerazioni sul layout per l'elemento WindowsFormsHost
Mapping di proprietà di Windows Form e WPF
Errori in fase di progettazione in Progettazione Windows Form