Procedura dettagliata: hosting di un controllo Windows Form di terze parti in un'applicazione WPF
In questa procedura dettagliata viene illustrato l'utilizzo di WPF Designer per Visual Studio per l'hosting di un controllo Windows Form di un fornitore di terze parti in un'applicazione WPF. Per ulteriori informazioni sull'interoperabilità tra Windows Form e WPF, vedere Migration and Interoperability.
In questa procedura dettagliata verrà utilizzato un controllo MonthCalendar per rappresentare un controllo di un fornitore di terze parti. Creare un tipo UserControl che include un'istanza del controllo MonthCalendar nell'insieme Controls. Il tipo UserControl espone una proprietà Date e implementa logica personalizzata per definire il comportamento del controllo MonthCalendar. Nell'applicazione WPF un elemento TextBlock viene associato alla proprietà Date.
Questa procedura dettagliata prevede l'esecuzione delle attività seguenti:
Creazione del progetto WPF.
Creazione di un controllo Windows Form in cui incapsulare il controllo del fornitore.
Hosting del controllo Windows Form in un'applicazione WPF.
Nella figura seguente è illustrata l'applicazione finale.
Nota
È possibile che le finestre di dialogo e i comandi di menu visualizzati siano diversi da quelli descritti nella Guida a seconda delle impostazioni attive o dell'edizione del programma. Per modificare le impostazioni, scegliere Importa/Esporta impostazioni dal menu Strumenti. Per ulteriori informazioni, vedere Gestione delle impostazioni.
Prerequisiti
Per completare la procedura dettagliata, è necessario disporre dei componenti seguenti:
- Visual Studio 2010.
Creazione del progetto WPF
Il primo passaggio consiste nella creazione del progetto WPF per l'applicazione host.
Per creare il progetto
In Visual Basic o Visual C# creare un nuovo progetto di applicazione denominato HostingMonthCalendar. Per ulteriori informazioni, vedere Procedura: creare un nuovo progetto di applicazione WPF.
MainWindow.xaml viene aperto in WPF Designer.
In Esplora soluzioni aggiungere un riferimento all'assembly WindowsFormsIntegration, denominato WindowsFormsIntegration.dll.
Creazione del controllo Windows Form composto
In questa procedura viene illustrato come creare un controllo composto derivando un tipo dalla classe UserControl.
Per creare il controllo Windows Form composto
In Visual Basic o Visual C# aggiungere alla soluzione un nuovo progetto di libreria di controlli Windows Form denominato VendorControlLibrary. Per ulteriori informazioni, vedere Procedura: aggiungere e rimuovere elementi di soluzione.
UserControl1 verrà aperto in Progettazione Windows Form.
In Esplora soluzioni fare clic con il pulsante destro del mouse sul file UserControl1 e scegliere Rinomina.
Modificare il nome del controllo in VendorControl. Se viene chiesto di rinominare tutti i riferimenti, scegliere Sì.
Nell'area di progettazione selezionare VendorControl.
Nella finestra Proprietà impostare il valore della proprietà Size su 200,200.
Fare doppio clic su MonthCalendar nella Casella degli strumenti.
Nell'area di progettazione verrà visualizzato un controllo MonthCalendar.
Nella finestra Proprietà impostare le seguenti proprietà per il controllo MonthCalendar:
Proprietà
Valore
Margin
0,0,0,0
ShowToday
False
Impostare le dimensioni di VendorControl in modo che corrispondano alle dimensioni del controllo MonthCalendar.
Selezionare il controllo MonthCalendar.
Nella finestra Proprietà fare clic sulla scheda Eventi e fare doppio clic sull'evento DateChanged.
Il file VendorControl verrà aperto nell'editor di codice e verrà aggiunto il gestore eventi per l'evento DateChanged.
Sostituire il codice esistente con quello riportato di seguito. In questo codice viene definita una proprietà Date e la logica per limitare le proprietà dell'intervallo di dati del controllo MonthCalendar, ovvero SelectionStart e SelectionEnd, sullo stesso valore di TodayDate. Nel codice viene inoltre implementata l'interfaccia INotifyPropertyChanged, utilizzata nell'associazione dati WPF.
Imports System Imports System.Collections.Generic Imports System.ComponentModel Imports System.Drawing Imports System.Data Imports System.Linq Imports System.Text Imports System.Windows.Forms Public Class VendorControl Inherits UserControl Implements INotifyPropertyChanged <Browsable(True)> _ Public Property [Date]() As String Get Return Me.MonthCalendar1.TodayDate.ToShortDateString() End Get Set(ByVal value As String) If value <> Me.MonthCalendar1.TodayDate.ToShortDateString() Then Dim newDate As DateTime = DateTime.Parse(value) Me.SetDate(newDate) Me.NotifyPropertyChanged("Date") End If End Set End Property Private Sub monthCalendar1_DateChanged( _ ByVal sender As Object, ByVal e As DateRangeEventArgs) _ Handles MonthCalendar1.DateChanged Me.SetDate(e.Start) Me.NotifyPropertyChanged("Date") End Sub Private Sub SetDate(ByVal [date] As DateTime) Me.MonthCalendar1.TodayDate = [date] Me.MonthCalendar1.SelectionStart = [date] Me.MonthCalendar1.SelectionEnd = [date] End Sub #Region "INotifyPropertyChanged Implementation" Public Event PropertyChanged As PropertyChangedEventHandler _ Implements INotifyPropertyChanged.PropertyChanged Private Sub NotifyPropertyChanged(ByVal info As String) RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(info)) End Sub #End Region End Class
using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Windows.Forms; namespace VendorControlLibrary { public partial class VendorControl : UserControl, INotifyPropertyChanged { public VendorControl() { InitializeComponent(); } [Browsable(true)] public string Date { get { return this.monthCalendar1.TodayDate.ToShortDateString(); } set { if (value != this.monthCalendar1.TodayDate.ToShortDateString()) { DateTime newDate = DateTime.Parse(value); this.SetDate(newDate); this.OnPropertyChanged("Date"); } } } private void monthCalendar1_DateChanged(object sender, DateRangeEventArgs e) { this.SetDate(e.Start); this.OnPropertyChanged("Date"); } private void SetDate(DateTime date) { this.monthCalendar1.TodayDate = date; this.monthCalendar1.SelectionStart = date; this.monthCalendar1.SelectionEnd = date; } #region INotifyPropertyChanged Implementation public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string propertyName) { if (this.PropertyChanged != null) { this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } #endregion } }
Per compilare la soluzione, scegliere Compila soluzione dal menu Compila.
Hosting del controllo Windows Form in WPF
Utilizzare l'elemento WindowsFormsHost per ospitare VendorControl in un'applicazione WPF.
Per ospitare il controllo Windows Form in WPF
Nel progetto HostingMonthCalendar di Esplora soluzioni aggiungere un riferimento al progetto VendorControlLibrary. Per ulteriori informazioni, vedere Procedura: aggiungere o rimuovere riferimenti in Visual Studio.
Aprire MainWindow.xaml in WPF Designer.
Dalla Casella degli strumenti trascinare un controllo WindowsFormsHost nell'area di progettazione.
Verrà aggiunto un riferimento all'assembly denominato WindowsFormsIntegration.dll al progetto HostingMonthCalendar.
In visualizzazione XAML sostituire il markup esistente con quello riportato di seguito. Questo XAML esegue il mapping dello spazio dei nomi VendorControlLibrary e viene associato un elemento TextBlock alla proprietà Date in VendorControl.
<Window x:Class="HostingMonthCalendar.MainWindow" xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" xmlns:v="clr-namespace:VendorControlLibrary;assembly=VendorControlLibrary" Title="Window1" Height="300" Width="300"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition /> </Grid.RowDefinitions> <WindowsFormsHost Name="Host" Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center"> <v:VendorControl Date="2/2/03" /> </WindowsFormsHost> <TextBlock Grid.Row="1" Text="{Binding ElementName=Host, Path=Child.Date, Mode=OneWay, UpdateSourceTrigger=PropertyChanged }" HorizontalAlignment="Stretch" VerticalAlignment="Center" TextAlignment="Center" TextDecorations="None" FontSize="24" /> </Grid> </Window>
Scegliere Avvia debug dal menu Debug.
Fare clic sul controllo MonthCalendar per modificare la data corrente. L'elemento WPF TextBlock viene aggiornato per visualizzare la data selezionata.
Passaggi successivi
Se il controllo verrà ampiamente utilizzato in un ambiente WPF, è possibile derivare la classe da WindowsFormsHost ed esporre la proprietà Date. In questo modo è possibile associare altri controlli WPF direttamente alla proprietà Date, senza utilizzare la sintassi Path=Child.Date.
È anche possibile ospitare i controlli WPF in Windows Form. Per ulteriori informazioni, vedere Utilizzo di controlli WPF.
Vedere anche
Attività
Procedura dettagliata: hosting di controlli Windows Form in WPF
Riferimenti
Altre risorse
Utilizzo di controlli in WPF Designer
Migration and Interoperability
Cronologia delle modifiche
Data |
Cronologia |
Motivo |
---|---|---|
Settembre 2010 |
Aggiunto passaggio mancante. |
Commenti e suggerimenti dei clienti. |