Delen via


Walkthrough: Eigenschappen toewijzen met het ElementHost-besturingselement

In dit overzicht ziet u hoe u de PropertyMap eigenschap kunt gebruiken om Eigenschappen van Windows Forms toe te wijzen aan bijbehorende eigenschappen op een gehost WPF-element.

De taken die in deze handleiding worden geïllustreerd, zijn onder andere:

  • Het project aanmaken.

  • Een nieuwe eigenschapstoewijzing definiëren.

  • Een standaardeigenschapstoewijzing verwijderen.

  • Een standaard eigenschap-mapping uitbreiden.

Wanneer u klaar bent, kunt u Eigenschappen van Windows Forms toewijzen aan bijbehorende WPF-eigenschappen op een gehost element.

Vereiste voorwaarden

U hebt de volgende onderdelen nodig om dit scenario te voltooien:

  • Visual Studio 2017

Het project maken

Het project maken

  1. Maak een Windows Forms App-project met de naam PropertyMappingWithElementHost.

  2. Voeg in Solution Explorer verwijzingen toe aan de volgende WPF-assembly's.

    • PresentationCore

    • PresentationFramework

    • WindowsBase

    • WindowsFormsIntegration

  3. Kopieer de volgende code naar het begin van het Form1 codebestand.

    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. Open Form1 in de Windows Forms Designer. Dubbelklik op het formulier om een gebeurtenis-handler voor de Load gebeurtenis toe te voegen.

  5. Ga terug naar Windows Forms Designer en voeg een gebeurtenis-handler toe voor de gebeurtenis van Resize het formulier. Voor meer informatie zie Event handlers maken met de ontwerper.

  6. Declareer een ElementHost veld in de Form1 klasse.

    ElementHost elemHost = null;
    
    Private elemHost As ElementHost = Nothing
    

Nieuwe eigenschapsmapping definiëren

Het ElementHost controle-element biedt verschillende standaardeigenschapstoewijzingen. U voegt een nieuwe eigenschapstoewijzing toe door de Add-methode aan te roepen op de ElementHost-controle's PropertyMap.

Nieuwe eigenschapstoewijzingen definiëren

  1. Kopieer de volgende code naar de definitie voor de Form1 klasse.

    // 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
    

    De AddMarginMapping methode voegt een nieuwe toewijzing voor de Margin eigenschap toe.

    De OnMarginChange methode vertaalt de Margin eigenschap naar de WPF-eigenschap Margin .

  2. Kopieer de volgende code naar de definitie voor de Form1 klasse.

    // 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
    

    De AddRegionMapping methode voegt een nieuwe toewijzing voor de Region eigenschap toe.

    De OnRegionChange methode vertaalt de Region eigenschap naar de WPF-eigenschap Clip .

    Met Form1_Resize de methode wordt de gebeurtenis van Resize het formulier verwerkt en wordt de grootte van het knipgebied aangepast aan het gehoste element.

Het verwijderen van een standaard eigenschapstoewijzing

Verwijder een standaardeigenschapstoewijzing door de Remove methode op het ElementHost besturingselement PropertyMapaan te roepen.

Een standaardeigenschapstoewijzing verwijderen

  • Kopieer de volgende code naar de definitie voor de Form1 klasse.

    // 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
    

    De RemoveCursorMapping methode verwijdert de standaardtoewijzing voor de Cursor eigenschap.

Een standaardeigenschapstoewijzing uitbreiden

U kunt een standaardeigenschapstoewijzing gebruiken en deze uitbreiden met uw eigen toewijzing.

De standaardtoewijzing van eigenschappen uitbreiden

  • Kopieer de volgende code naar de definitie voor de Form1 klasse.

    // 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
    

    Met ExtendBackColorMapping de methode wordt een aangepaste eigenschapvertaler toegevoegd aan de bestaande BackColor eigenschapstoewijzing.

    Met OnBackColorChange de methode wordt een specifieke installatiekopie toegewezen aan de eigenschap van Background het gehoste besturingselement. De OnBackColorChange methode wordt aangeroepen nadat de standaardeigenschapstoewijzing is toegepast.

Uw eigenschapstoewijzingen initialiseren

  1. Kopieer de volgende code naar de definitie voor de Form1 klasse.

    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
    

    De Form1_Load methode verwerkt de Load gebeurtenis en voert de volgende initialisatie uit.

    • Hiermee maakt u een WPF-element Button .

    • Roept de eerder gedefinieerde methoden aan in de walkthrough om de eigenschapstoewijzingen in te stellen.

    • Hiermee worden initiële waarden ingesteld aan de gemapte eigenschappen.

  2. Druk op F5 om de toepassing te bouwen en uit te voeren.

Zie ook