This article is currently in the process of being translated into Italian (~99% done).
The WindowsFormsHost control
WPF e WinForms sono due framework UI diversi, entrambi creati da Microsoft. WPF è pensato per essere un'alternativa moderna a WinForms, che è stato il primo UI framework .NET. Per alleggerire il passaggio tra i due, Microsoft si è accertato che i controlli di WinForms potessero essere usati anche all'interno di un applicazione WPF. Questo avviene con WindowsFormsHost, di cui parleremo in questo articolo.
Per utilizzare WindowsFormsHost e i controlli di WinForms, è necessario aggiungere un riferimento ai seguenti assembly nella tua applicazione:
- Integrazione dei Form di Windows
- Libreria System.Windows.Forms
In Visual Studio, questo viene fatto facendo click con il pulsante destro del mouse sul nodo "References" del progetto e selezionare "Add reference":
Nella finestra di dialogo che si apre, è necessario selezionare "Assemblies" e quindi fare check sui due assemblies che è necessario aggiungere:
Usare il controllo WinForms WebBrowser
In un precedente articolo, abbiamo utilizzato il controllo Web browser browser per creare un piccolo browser Web. Tuttavia, come indicato in quell'articolo, il controllo WPF WebBrowser è un po' limitato rispetto alla versione di WinForms. Ci sono molti esempi di cose che si possono fare facilmente con la versione di WinForms, che sono più difficili o impossibili da fare con la versione di WPF.
Ad esempio la proprietà DocumentTitle e l'evento DocumentTitleChanged corrispondente, che permette di ottenere e aggiornare il titolo della finestra in modo che corrisponda al titolo della pagina Web corrente. Useremo questo come una scusa per testare la versione di WinForms proprio qui nella nostra applicazione WPF:
<Window x:Class="WpfTutorialSamples.Misc_controls.WindowsFormsHostSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
Title="WindowsFormsHostSample" Height="350" Width="450">
<Grid>
<WindowsFormsHost Name="wfhSample">
<WindowsFormsHost.Child>
<wf:WebBrowser DocumentTitleChanged="wbWinForms_DocumentTitleChanged" />
</WindowsFormsHost.Child>
</WindowsFormsHost>
</Grid>
</Window>
using System;
using System.Windows;
namespace WpfTutorialSamples.Misc_controls
{
public partial class WindowsFormsHostSample : Window
{
public WindowsFormsHostSample()
{
InitializeComponent();
(wfhSample.Child as System.Windows.Forms.WebBrowser).Navigate("http://www.wpf-tutorial.com");
}
private void wbWinForms_DocumentTitleChanged(object sender, EventArgs e)
{
this.Title = (sender as System.Windows.Forms.WebBrowser).DocumentTitle;
}
}
}
Presta particolare attenzione alla riga in cui aggiungiamo lo spazio dei nomi WinForms alla finestra, in modo che possiamo fare riferimento ai controlli da esso:
xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
Questo ci permetterà di fare riferimento ai controlli di WinForms usando il prefisso wf
WindowsFormsHost è abbastanza semplice da usare, come puoi vedere. Ha una proprietà Child, in cui è possibile definire un singolo controllo WinForms, proprio come il WPF. La finestra contiene solo un controllo radice singolo. Se hai bisogno di più controlli da WinForms all'interno di WindowsFormsHost, puoi utilizzare il controllo Panel da WinForms o da qualsiasi altro controllo contenitore.
Il controllo WebBrowser della WinForms viene utilizzato facendo riferimento all'assembly System.Windows.Forms, utilizzando il prefisso wf, come spiegato sopra.
Nel Code-behind , eseguiamo una prima chiamata a Navigate, per avere una pagina Web iniziale. Gestiamo quindi l'evento DocumentTitleChanged , in cui aggiorniamo la proprietà Title della finestra in base all'attuale valore DocumentTitle del controllo WebBrowser.
Congratulazioni, ora hai un'applicazione WPF con un WinForms WebBrowser ospitato al suo interno.
Riassunto
Come puoi vedere, usare i controlli WinForms all'interno delle tue applicazioni WPF è abbastanza semplice, ma la domanda rimane: è una buona idea?
In generale, potresti volerlo evitare. Esistono numerosi problemi che possono o meno influire sull'applicazione (molti di questi sono descritti in questo MSDN articolo: http://msdn.microsoft.com/en-us/ libreria / aa970911% 28v = VS.100% 29.aspx ), ma un problema più grave è che questo tipo di mixaggio del framework dell'interfaccia utente potrebbe non essere supportato nelle versioni future del framework .NET.
Alla fine, però, la decisione spetta a te: hai davvero bisogno del controllo WinForms o esiste un'alternativa WPF che potrebbe funzionare altrettanto bene?