Udostępnij za pośrednictwem


Przewodnik: mapowanie właściwości za pomocą kontrolki ElementHost

W tym przewodniku pokazano, jak za pomocą właściwości PropertyMap zamapować właściwości formularzy systemu Windows na odpowiednie właściwości w hostowanym elememencie WPF.

Zadania przedstawione w tym przewodniku obejmują:

  • Tworzenie projektu.

  • Definiowanie nowego mapowania właściwości.

  • Usuwanie domyślnego mapowania właściwości.

  • Rozszerzanie domyślnego mapowania właściwości.

Po zakończeniu będzie można mapować właściwości formularzy systemu Windows na odpowiednie właściwości WPF w elememencie hostowanym.

Warunki wstępne

Do ukończenia tego przewodnika potrzebne są następujące składniki:

  • Visual Studio 2017

Tworzenie projektu

Aby utworzyć projekt

  1. Utwórz projekt aplikacji Windows Forms o nazwie .

  2. W eksploratorze rozwiązań dodaj odwołania do następujących zestawów WPF.

    • PresentationCore

    • PresentationFramework

    • WindowsBase

    • WindowsFormsIntegration

  3. Skopiuj poniższy kod w górnej części pliku kodu Form1.

    using System.Windows;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Forms.Integration;
    
    Imports System.Windows
    Imports System.Windows.Media
    Imports System.Windows.Media.Imaging
    Imports System.Windows.Forms.Integration
    
  4. Otwórz Form1 w programie Windows Forms Designer. Kliknij dwukrotnie formularz, aby dodać procedurę obsługi zdarzeń dla zdarzenia Load.

  5. Wróć do programu Windows Forms Designer i dodaj procedurę obsługi zdarzeń dla zdarzenia Resize formularza. Aby uzyskać więcej informacji, zobacz Jak: Tworzyć procedury obsługi zdarzeń za pomocą Projektanta.

  6. Zadeklaruj pole ElementHost w klasie Form1.

    ElementHost elemHost = null;
    
    Private elemHost As ElementHost = Nothing
    

Definiowanie nowych mapowań właściwości

Kontrolka ElementHost udostępnia kilka domyślnych mapowań właściwości. Dodajesz nowe mapowanie właściwości, wywołując metodę Add na kontrolce ElementHost w PropertyMap.

Aby zdefiniować nowe mapowania właściwości

  1. Skopiuj następujący kod do definicji klasy Form1.

    // 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;
    }
    
    ' 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
    

    Metoda AddMarginMapping dodaje nowe mapowanie właściwości Margin.

    Metoda OnMarginChange tłumaczy właściwość Margin na właściwość Margin WPF.

  2. Skopiuj następujący kod do definicji klasy Form1.

    // 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);
    }
    
    ' 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
    

    Metoda AddRegionMapping dodaje nowe mapowanie właściwości Region.

    Metoda OnRegionChange tłumaczy właściwość Region na właściwość Clip WPF.

    Metoda Form1_Resize obsługuje zdarzenie Resize formularza i rozmiaruje region wycinków w celu dopasowania go do hostowanego elementu.

Usuwanie domyślnego mapowania właściwości

Usuń domyślne mapowanie właściwości, wywołując metodę Remove na elemencie PropertyMapkontrolki ElementHost.

Aby usunąć domyślne mapowanie właściwości

  • Skopiuj następujący kod do definicji klasy Form1.

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

    Metoda RemoveCursorMapping usuwa domyślne mapowanie właściwości Cursor.

Rozszerzanie domyślnego mapowania właściwości

Możesz użyć domyślnego mapowania właściwości, a także rozszerzyć go przy użyciu własnego mapowania.

Aby rozszerzyć domyślne mapowanie właściwości

  • Skopiuj następujący kod do definicji klasy Form1.

    // 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;
    }
    
    ' 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
    

    Metoda ExtendBackColorMapping dodaje translator właściwości niestandardowych do istniejącego mapowania właściwości BackColor.

    Metoda OnBackColorChange przypisuje określony obraz do właściwości Background hostowanej kontrolki. Metoda OnBackColorChange jest wywoływana po zastosowaniu domyślnego mapowania właściwości.

Zainicjuj mapowania właściwości

  1. Skopiuj następujący kod do definicji klasy Form1.

    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;
    }
    
    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
    

    Metoda Form1_Load obsługuje zdarzenie Load i wykonuje następującą inicjację.

    • Tworzy element Button w WPF.

    • Wywołuje metody, które zdefiniowałeś wcześniej w przewodniku krok po kroku, w celu skonfigurowania mapowania właściwości.

    • Przypisuje wartości początkowe do zamapowanych właściwości.

  2. Naciśnij F5, aby skompilować i uruchomić aplikację.

Zobacz też