Condividi tramite


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.

Hosting di un controllo Windows Form

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

  1. 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.

  2. 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

  1. 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.

  2. In Esplora soluzioni fare clic con il pulsante destro del mouse sul file UserControl1 e scegliere Rinomina.

  3. Modificare il nome del controllo in VendorControl. Se viene chiesto di rinominare tutti i riferimenti, scegliere .

  4. Nell'area di progettazione selezionare VendorControl.

  5. Nella finestra Proprietà impostare il valore della proprietà Size su 200,200.

  6. Fare doppio clic su MonthCalendar nella Casella degli strumenti.

    Nell'area di progettazione verrà visualizzato un controllo MonthCalendar.

  7. Nella finestra Proprietà impostare le seguenti proprietà per il controllo MonthCalendar:

    Proprietà

    Valore

    Margin

    0,0,0,0

    ShowToday

    False

  8. Impostare le dimensioni di VendorControl in modo che corrispondano alle dimensioni del controllo MonthCalendar.

  9. Selezionare il controllo MonthCalendar.

  10. 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.

  11. 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
        }
    }
    
  12. 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

  1. Nel progetto HostingMonthCalendar di Esplora soluzioni aggiungere un riferimento al progetto VendorControlLibrary. Per ulteriori informazioni, vedere Procedura: aggiungere o rimuovere riferimenti in Visual Studio.

  2. Aprire MainWindow.xaml in WPF Designer.

  3. Dalla Casella degli strumenti trascinare un controllo WindowsFormsHost nell'area di progettazione.

    Verrà aggiunto un riferimento all'assembly denominato WindowsFormsIntegration.dll al progetto HostingMonthCalendar.

  4. 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>
    
  5. Scegliere Avvia debug dal menu Debug.

  6. 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

WindowsFormsHost

ElementHost

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.