Condividi tramite


Procedura dettagliata: mapping delle proprietà tramite il controllo ElementHost

In questa procedura dettagliata viene mostrato l'utilizzo della proprietà PropertyMap per eseguire il mapping delle proprietà di Windows Forms alle proprietà corrispondenti di un elemento WPF ospitato.

Di seguito sono elencate le attività illustrate in questa procedura dettagliata:

  • Creazione del progetto.

  • Definizione di un nuovo mapping della proprietà.

  • Rimozione di un mapping della proprietà predefinito.

  • Estensione di un mapping della proprietà predefinito.

Per un elenco di codice completo delle attività illustrate in questa procedura dettagliata, vedere Esempio di mapping delle proprietà tramite il controllo ElementHost (la pagina potrebbe essere in inglese).

Al termine della procedura, si sarà in grado di eseguire il mapping delle proprietà di Windows Forms alle proprietà di WPF corrispondenti di un elemento ospitato.

Prerequisiti

Per completare la procedura dettagliata, è necessario disporre dei componenti seguenti:

  • Visual Studio 2008.

Creazione del progetto

Per creare il progetto

  1. Creare un progetto dell'applicazione Windows Forms denominato PropertyMappingWithElementHost. Per ulteriori informazioni, vedere Procedura: creare un progetto applicazione Windows.

  2. In Esplora soluzioni aggiungere riferimenti agli assembly WPF indicati di seguito. 

    • PresentationCore

    • PresentationFramework

    • WindowsBase

    • WindowsFormsIntegration

  3. Copiare il codice seguente all'inizio del file di codice Form1.

    Imports System.Windows
    Imports System.Windows.Media
    Imports System.Windows.Media.Imaging
    Imports System.Windows.Forms.Integration
    
    using System.Windows;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Forms.Integration;
    
  4. Aprire Form1 in Progettazione Windows Form. Fare doppio clic sul form per aggiungere un gestore eventi per l'evento Load.

  5. Tornare a Progettazione Windows Form e aggiungere un gestore eventi per l'evento Resize del form. Per ulteriori informazioni, vedere Procedura: creare le impostazioni delle applicazioni utilizzando la finestra di progettazione.

  6. Dichiarare un campo ElementHost nella classe Form1.

    Private elemHost As ElementHost = Nothing
    
    ElementHost elemHost = null;
    

Definizione di nuovi mapping della proprietà

Il controllo ElementHost fornisce diversi mapping della proprietà predefiniti. È possibile aggiungere un nuovo mapping della proprietà chiamando il metodo Add sull'oggetto PropertyMap del controllo ElementHost.

Per definire nuovi mapping della proprietà

  1. Copiare il codice riportato di seguito nella definizione della classe Form1.

    ' The AddMarginMapping method adds a new property mapping
    ' for the Margin property.
    Private Sub AddMarginMapping()
    
        elemHost.PropertyMap.Add( _
            "Margin", _
            New PropertyTranslator(AddressOf OnMarginChange))
    
    End Sub
    
    
    ' The OnMarginChange method implements the mapping 
    ' from the Windows Forms Margin property to the
    ' Windows Presentation Foundation Margin property.
    '
    ' The provided Padding value is used to construct 
    ' a Thickness value for the hosted element's Margin
    ' property.
    Private Sub OnMarginChange( _
    ByVal h As Object, _
    ByVal propertyName As String, _
    ByVal value As Object)
    
        Dim host As ElementHost = h
        Dim p As Padding = CType(value, Padding)
        Dim wpfButton As System.Windows.Controls.Button = host.Child
    
    
        Dim t As New Thickness(p.Left, p.Top, p.Right, p.Bottom)
    
        wpfButton.Margin = t
    
    End Sub
    
    // The AddMarginMapping method adds a new property mapping
    // for the Margin property.
    private void AddMarginMapping()
    {
        elemHost.PropertyMap.Add(
            "Margin",
            new PropertyTranslator(OnMarginChange));
    }
    
    // The OnMarginChange method implements the mapping 
    // from the Windows Forms Margin property to the
    // Windows Presentation Foundation Margin property.
    //
    // The provided Padding value is used to construct 
    // a Thickness value for the hosted element's Margin
    // property.
    private void OnMarginChange(object h, String propertyName, object value)
    {
        ElementHost host = h as ElementHost;
        Padding p = (Padding)value;
        System.Windows.Controls.Button wpfButton = 
            host.Child as System.Windows.Controls.Button;
    
        Thickness t = new Thickness(p.Left, p.Top, p.Right, p.Bottom );
    
        wpfButton.Margin = t;
    }
    

    Il metodo AddMarginMapping aggiunge un nuovo mapping per la proprietà Margin.

    Il metodo OnMarginChange converte la proprietà Margin nella proprietà Margin WPF.

  2. Copiare il codice riportato di seguito nella definizione della classe Form1.

    ' The AddRegionMapping method assigns a custom 
    ' mapping for the Region property.
    Private Sub AddRegionMapping()
    
        elemHost.PropertyMap.Add( _
            "Region", _
            New PropertyTranslator(AddressOf OnRegionChange))
    
    End Sub
    
    
    ' The OnRegionChange method assigns an EllipseGeometry to
    ' the hosted element's Clip property.
    Private Sub OnRegionChange( _
    ByVal h As Object, _
    ByVal propertyName As String, _
    ByVal value As Object)
    
        Dim host As ElementHost = h
    
        Dim wpfButton As System.Windows.Controls.Button = host.Child
    
        wpfButton.Clip = New EllipseGeometry(New Rect( _
            0, _
            0, _
            wpfButton.ActualWidth, _
            wpfButton.ActualHeight))
    
    End Sub
    
    
    ' The Form1_Resize method handles the form's Resize event.
    ' It calls the OnRegionChange method explicitly to 
    ' assign a new clipping geometry to the hosted element.
    Private Sub Form1_Resize( _
    ByVal sender As Object, _
    ByVal e As EventArgs) Handles MyBase.Resize
    
        If elemHost IsNot Nothing Then
            Me.OnRegionChange(elemHost, "Region", Nothing)
        End If
    
    End Sub
    
    // The AddRegionMapping method assigns a custom 
    // mapping for the Region property.
    private void AddRegionMapping()
    {
        elemHost.PropertyMap.Add(
            "Region",
            new PropertyTranslator(OnRegionChange));
    }
    
    // The OnRegionChange method assigns an EllipseGeometry to
    // the hosted element's Clip property.
    private void OnRegionChange(
        object h, 
        String propertyName, 
        object value)
    {
        ElementHost host = h as ElementHost;
        System.Windows.Controls.Button wpfButton = 
            host.Child as System.Windows.Controls.Button;
    
        wpfButton.Clip = new EllipseGeometry(new Rect(
            0, 
            0, 
            wpfButton.ActualWidth, 
            wpfButton.ActualHeight));
    }
    
    // The Form1_Resize method handles the form's Resize event.
    // It calls the OnRegionChange method explicitly to 
    // assign a new clipping geometry to the hosted element.
    private void Form1_Resize(object sender, EventArgs e)
    {
        this.OnRegionChange(elemHost, "Region", null);
    }
    

    Il metodo AddRegionMapping aggiunge un nuovo mapping per la proprietà Region.

    Il metodo OnRegionChange converte la proprietà Region nella proprietà Clip WPF.

    Il metodo Form1_Resize gestisce l'evento Resize del form e adatta le dimensioni dell'area di ritaglio all'elemento ospitato.

Rimozione di un mapping della proprietà predefinito

È possibile rimuovere un mapping della proprietà predefinito chiamando il metodo Remove sull'oggetto PropertyMap del controllo ElementHost.

Per rimuovere un mapping della proprietà predefinito

  • Copiare il codice riportato di seguito nella definizione della classe Form1.

    ' The RemoveCursorMapping method deletes the default
    ' mapping for the Cursor property.
    Private Sub RemoveCursorMapping()
        elemHost.PropertyMap.Remove("Cursor")
    End Sub
    
    // The RemoveCursorMapping method deletes the default
    // mapping for the Cursor property.
    private void RemoveCursorMapping()
    {
        elemHost.PropertyMap.Remove("Cursor");
    }
    

    Il metodo RemoveCursorMapping elimina il mapping predefinito della proprietà Cursor.

Estensione di un mapping della proprietà predefinito

È possibile utilizzare un mapping della proprietà predefinito ed estenderlo con un mapping personalizzato.

Per estendere un mapping della proprietà predefinito

  • Copiare il codice riportato di seguito nella definizione della classe Form1.

    ' The ExtendBackColorMapping method adds a property
    ' translator if a mapping already exists.
    Private Sub ExtendBackColorMapping()
    
        If elemHost.PropertyMap("BackColor") IsNot Nothing Then
    
            elemHost.PropertyMap("BackColor") = PropertyTranslator.Combine( _
                elemHost.PropertyMap("BackColor"), _
                PropertyTranslator.CreateDelegate( _
                GetType(PropertyTranslator), _
                Me, _
                "OnBackColorChange"))
        End If
    
    End Sub
    
    
    ' The OnBackColorChange method assigns a specific image 
    ' to the hosted element's Background property.
    Private Sub OnBackColorChange( _
    ByVal h As Object, _
    ByVal propertyName As String, _
    ByVal value As Object)
    
        Dim host As ElementHost = h
        Dim wpfButton As System.Windows.Controls.Button = host.Child
        Dim b As New ImageBrush(New BitmapImage( _
            New Uri("file:///C:\WINDOWS\Santa Fe Stucco.bmp")))
        wpfButton.Background = b
    
    End Sub
    
    // The ExtendBackColorMapping method adds a property
    // translator if a mapping already exists.
    private void ExtendBackColorMapping()
    {
        if (elemHost.PropertyMap["BackColor"] != null)
        {
            elemHost.PropertyMap["BackColor"] += 
                new PropertyTranslator(OnBackColorChange);
        }
    }
    
    // The OnBackColorChange method assigns a specific image 
    // to the hosted element's Background property.
    private void OnBackColorChange(object h, String propertyName, object value)
    {
        ElementHost host = h as ElementHost;
        System.Windows.Controls.Button wpfButton = 
            host.Child as System.Windows.Controls.Button;
    
        ImageBrush b = new ImageBrush(new BitmapImage(
            new Uri(@"file:///C:\WINDOWS\Santa Fe Stucco.bmp")));
        wpfButton.Background = b;
    }
    

    Il metodo ExtendBackColorMapping aggiunge un convertitore di proprietà personalizzato al mapping della proprietà BackColor esistente.

    Il metodo OnBackColorChange assegna una specifica immagine alla proprietà Background del controllo ospitato. Il metodo OnBackColorChange viene chiamato dopo l'applicazione del mapping della proprietà predefinito.

Inizializzazione dei mapping della proprietà

Per inizializzare i mapping della proprietà

  1. Copiare il codice riportato di seguito nella definizione della classe Form1.

    Private Sub Form1_Load( _
    ByVal sender As Object, _
    ByVal e As EventArgs) Handles MyBase.Load
    
        ' Create the ElementHost control.
        elemHost = New ElementHost()
        elemHost.Dock = DockStyle.Fill
        Me.Controls.Add(elemHost)
    
        ' Create a Windows Presentation Foundation Button element 
        ' and assign it as the ElementHost control's child. 
        Dim wpfButton As New System.Windows.Controls.Button()
        wpfButton.Content = "Windows Presentation Foundation Button"
        elemHost.Child = wpfButton
    
        ' Map the Margin property.
        Me.AddMarginMapping()
    
        ' Remove the mapping for the Cursor property.
        Me.RemoveCursorMapping()
    
        ' Add a mapping for the Region property.
        Me.AddRegionMapping()
    
        ' Add another mapping for the BackColor property.
        Me.ExtendBackColorMapping()
    
        ' Cause the OnMarginChange delegate to be called.
        elemHost.Margin = New Padding(23, 23, 23, 23)
    
        ' Cause the OnRegionChange delegate to be called.
        elemHost.Region = New [Region]()
    
        ' Cause the OnBackColorChange delegate to be called.
        elemHost.BackColor = System.Drawing.Color.AliceBlue
    
    End Sub
    
    private void Form1_Load(object sender, EventArgs e)
    {
        // Create the ElementHost control.
        elemHost = new ElementHost();
        elemHost.Dock = DockStyle.Fill;
        this.Controls.Add(elemHost);
    
        // Create a Windows Presentation Foundation Button element 
        // and assign it as the ElementHost control's child. 
        System.Windows.Controls.Button wpfButton = new System.Windows.Controls.Button();
        wpfButton.Content = "Windows Presentation Foundation Button";
        elemHost.Child = wpfButton;
    
        // Map the Margin property.
        this.AddMarginMapping();
    
        // Remove the mapping for the Cursor property.
        this.RemoveCursorMapping();
    
        // Add a mapping for the Region property.
        this.AddRegionMapping();
    
        // Add another mapping for the BackColor property.
        this.ExtendBackColorMapping();
    
        // Cause the OnMarginChange delegate to be called.
        elemHost.Margin = new Padding(23, 23, 23, 23);
    
        // Cause the OnRegionChange delegate to be called.
        elemHost.Region = new Region();
    
        // Cause the OnBackColorChange delegate to be called.
        elemHost.BackColor = System.Drawing.Color.AliceBlue;
    }
    

    Il metodo Form1_Load gestisce l'evento Load ed esegue la seguente inizializzazione.

    • Crea un elemento WPF Button.

    • Chiama i metodi definiti in precedenza nella procedura dettagliata per configurare i mapping della proprietà.

    • Assegna i valori iniziali alle proprietà di cui è stato eseguito il mapping.

  2. Premere F5 per compilare ed eseguire l'applicazione.

Vedere anche

Riferimenti

ElementHost.PropertyMap

WindowsFormsHost.PropertyMap

WindowsFormsHost

Concetti

Mapping di proprietà di Windows Form e WPF

Procedura dettagliata: hosting di controlli compositi di WPF in Windows Form

Altre risorse

WPF Designer