Exemplarische Vorgehensweise: Zuordnen von Eigenschaften mit dem WindowsFormsHost-Element

Aktualisiert: November 2007

In dieser exemplarischen Vorgehensweise wird veranschaulicht, wie Sie anhand der PropertyMap-Eigenschaft die WPF-Eigenschaften den entsprechenden Eigenschaften eines gehosteten Windows Forms-Steuerelements zuordnen.

In dieser exemplarischen Vorgehensweise werden folgende Aufgaben veranschaulicht:

  • Erstellen des Projekts.

  • Definieren des Anwendungslayouts.

  • Definieren einer neuen Eigenschaftenzuordnung.

  • Entfernen der Standardzuordnung einer Eigenschaft.

  • Ersetzen der Standardzuordnung einer Eigenschaft.

  • Erweitern der Standardzuordnung einer Eigenschaft.

Eine vollständige Codeauflistung der in dieser exemplarischen Vorgehensweise veranschaulichten Aufgaben finden Sie unter Zuordnen von Eigenschaften mithilfe des Beispiels zum WindowsFormsHost-Element.

Nach Abschluss können Sie WPF-Eigenschaften den entsprechenden Eigenschaften eines gehosteten Windows Forms-Steuerelements zuordnen.

Hinweis: Je nach den aktiven Einstellungen oder der verwendeten Version können sich die angezeigten Dialogfelder und Menübefehle von den in der Hilfe beschriebenen unterscheiden. Wählen Sie im Menü Extras die Option Einstellungen importieren und exportieren aus, um die Einstellungen zu ändern. Weitere Informationen finden Sie unter Visual Studio-Einstellungen.

Vorbereitungsmaßnahmen

Zum Durchführen dieser exemplarischen Vorgehensweise benötigen Sie die folgenden Komponenten:

  • Visual Studio 2008.

Erstellen des Projekts

So erstellen Sie das Projekt und richten es ein

  1. Erstellen Sie ein WPF-Anwendungsprojekt mit dem Namen PropertyMappingWithWfh.

  2. Fügen Sie im Projektmappen-Explorer einen Verweis auf die WindowsFormsIntegration-Assembly mit dem Namen WindowsFormsIntegration.dll hinzu.

  3. Fügen Sie im Projektmappen-Explorer Verweise auf die Assemblys System.Drawing und System.Windows.Forms hinzu.

Definieren des Anwendungslayouts

Die WPF-basierte Anwendung verwendet das WindowsFormsHost-Element, um ein Windows Forms-Steuerelement zu hosten.

So definieren Sie das Anwendungslayout

  1. Öffnen Sie im WPF-Designer die Datei Window1.xaml.

  2. Ersetzen Sie den vorhandenen Code durch den folgenden Code.

    <Window x:Class="Window1"
        xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
        Title="PropertyMappingWithWfh" Height="300" Width="300"
        Loaded="WindowLoaded">
      <DockPanel Name="panel1" LastChildFill="True">
        <WindowsFormsHost Name="wfHost" DockPanel.Dock="Left" SizeChanged="Window1_SizeChanged" FontSize="20" />
      </DockPanel>
    </Window>
    
    <Window x:Class="PropertyMappingWithWfh.Window1"
        xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
        Title="PropertyMappingWithWfh" Height="300" Width="300"
        Loaded="WindowLoaded">
      <DockPanel Name="panel1" LastChildFill="True">
        <WindowsFormsHost Name="wfHost" DockPanel.Dock="Left" SizeChanged="Window1_SizeChanged" FontSize="20" />
      </DockPanel>
    </Window>
    
  3. Öffnen Sie Window1.xaml.cs im Code-Editor.

  4. Importieren Sie am Anfang der Datei die folgenden Namespaces.

    Imports System.Drawing
    Imports System.Drawing.Drawing2D
    Imports System.Windows.Forms
    Imports System.Windows.Forms.Integration
    
    using System.Drawing;
    using System.Drawing.Drawing2D;
    using System.Windows.Forms;
    using System.Windows.Forms.Integration;
    

Definieren einer neuen Eigenschaftenzuordnung

Das WindowsFormsHost-Element stellt mehrere Standardzuordnungen von Eigenschaften bereit. Sie fügen eine neue Eigenschaftenzuordnung hinzu, indem Sie die Add-Methode in der PropertyMap des WindowsFormsHost-Elements aufrufen.

So definieren Sie eine neue Eigenschaftenzuordnung

  • Kopieren Sie den folgenden Code in die Window1-Klassendefinition.

    ' The AddClipMapping method adds a custom mapping 
    ' for the Clip property.
    Private Sub AddClipMapping()
    
        wfHost.PropertyMap.Add( _
            "Clip", _
            New PropertyTranslator(AddressOf OnClipChange))
    
    End Sub
    
    ' The OnClipChange method assigns an elliptical clipping 
    ' region to the hosted control's Region property.
    Private Sub OnClipChange( _
    ByVal h As Object, _
    ByVal propertyName As String, _
    ByVal value As Object)
    
        Dim host As WindowsFormsHost = h
    
        Dim cb As System.Windows.Forms.CheckBox = host.Child
    
        If cb IsNot Nothing Then
            cb.Region = Me.CreateClipRegion()
        End If
    
    End Sub
    
    ' The Window1_SizeChanged method handles the window's 
    ' SizeChanged event. It calls the OnClipChange method explicitly 
    ' to assign a new clipping region to the hosted control.
    Private Sub Window1_SizeChanged( _
    ByVal sender As Object, _
    ByVal e As SizeChangedEventArgs)
    
        Me.OnClipChange(wfHost, "Clip", Nothing)
    
    End Sub
    
    ' The CreateClipRegion method creates a Region from an
    ' elliptical GraphicsPath.
    Private Function CreateClipRegion() As [Region] 
        Dim path As New GraphicsPath()
    
        path.StartFigure()
    
        path.AddEllipse(New System.Drawing.Rectangle( _
            0, _
            0, _
            wfHost.ActualWidth, _
            wfHost.ActualHeight))
    
        path.CloseFigure()
    
        Return New [Region](path)
    
    End Function
    
    // The AddClipMapping method adds a custom 
    // mapping for the Clip property.
    private void AddClipMapping()
    {
        wfHost.PropertyMap.Add(
            "Clip",
            new PropertyTranslator(OnClipChange));
    }
    
    // The OnClipChange method assigns an elliptical clipping 
    // region to the hosted control's Region property.
    private void OnClipChange(object h, String propertyName, object value)
    {
        WindowsFormsHost host = h as WindowsFormsHost;
        System.Windows.Forms.CheckBox cb = host.Child as System.Windows.Forms.CheckBox;
    
        if (cb != null)
        {
            cb.Region = this.CreateClipRegion();
        }
    }
    
    // The Window1_SizeChanged method handles the window's 
    // SizeChanged event. It calls the OnClipChange method explicitly 
    // to assign a new clipping region to the hosted control.
    private void Window1_SizeChanged(object sender, SizeChangedEventArgs e)
    {
        this.OnClipChange(wfHost, "Clip", null);
    }
    
    // The CreateClipRegion method creates a Region from an
    // elliptical GraphicsPath.
    private Region CreateClipRegion()
    {   
        GraphicsPath path = new GraphicsPath();
    
        path.StartFigure(); 
    
        path.AddEllipse(new System.Drawing.Rectangle( 
            0, 
            0, 
            (int)wfHost.ActualWidth, 
            (int)wfHost.ActualHeight ) );
    
        path.CloseFigure(); 
    
        return( new Region(path) );
    }
    

    Die AddClipMapping-Methode fügt eine neue Zuordnung für die Clip-Eigenschaft hinzu.

    Die OnClipChange-Methode übersetzt die Clip-Eigenschaft in die Windows Forms-Region-Eigenschaft.

    Die Window1_SizeChanged-Methode verarbeitet das SizeChanged-Fensterereignis und passt die Größe des Clippingbereichs dem Anwendungsfenster an.

Entfernen der Standardzuordnung einer Eigenschaft

Sie entfernen die Standardzuordnung einer Eigenschaft, indem Sie die Remove-Methode in der PropertyMap des WindowsFormsHost-Elements aufrufen.

So entfernen Sie die Standardzuordnung einer Eigenschaft

  • Kopieren Sie den folgenden Code in die Window1-Klassendefinition.

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

    Die RemoveCursorMapping-Methode löscht die Standardzuordnung für die Cursor-Eigenschaft.

Ersetzen der Standardzuordnung einer Eigenschaft

Sie ersetzen die Standardzuordnung einer Eigenschaft, indem Sie die Standardzuordnung entfernen und die Add-Methode in der PropertyMap des WindowsFormsHost-Elements aufrufen.

So ersetzen Sie die Standardzuordnung einer Eigenschaft

  • Kopieren Sie den folgenden Code in die Window1-Klassendefinition.

    ' The ReplaceFlowDirectionMapping method replaces the
    ' default mapping for the FlowDirection property.
    Private Sub ReplaceFlowDirectionMapping()
    
        wfHost.PropertyMap.Remove("FlowDirection")
    
        wfHost.PropertyMap.Add( _
            "FlowDirection", _
            New PropertyTranslator(AddressOf OnFlowDirectionChange))
    End Sub
    
    
    ' The OnFlowDirectionChange method translates a 
    ' Windows Presentation Foundation FlowDirection value 
    ' to a Windows Forms RightToLeft value and assigns
    ' the result to the hosted control's RightToLeft property.
    Private Sub OnFlowDirectionChange( _
    ByVal h As Object, _
    ByVal propertyName As String, _
    ByVal value As Object)
    
        Dim host As WindowsFormsHost = h
    
        Dim fd As System.Windows.FlowDirection = _
            CType(value, System.Windows.FlowDirection)
    
        Dim cb As System.Windows.Forms.CheckBox = host.Child
    
        cb.RightToLeft = IIf(fd = System.Windows.FlowDirection.RightToLeft, _
            RightToLeft.Yes, _
            RightToLeft.No)
    
    End Sub
    
    
    ' The cb_CheckedChanged method handles the hosted control's
    ' CheckedChanged event. If the Checked property is true,
    ' the flow direction is set to RightToLeft, otherwise it is
    ' set to LeftToRight.
    Private Sub cb_CheckedChanged( _
    ByVal sender As Object, _
    ByVal e As EventArgs)
    
        Dim cb As System.Windows.Forms.CheckBox = sender
    
        wfHost.FlowDirection = IIf(cb.CheckState = CheckState.Checked, _
        System.Windows.FlowDirection.RightToLeft, _
        System.Windows.FlowDirection.LeftToRight)
    
    End Sub
    
    // The ReplaceFlowDirectionMapping method replaces the  
    // default mapping for the FlowDirection property.
    private void ReplaceFlowDirectionMapping()
    {
        wfHost.PropertyMap.Remove("FlowDirection");
    
        wfHost.PropertyMap.Add(
            "FlowDirection",
            new PropertyTranslator(OnFlowDirectionChange));
    }
    
    // The OnFlowDirectionChange method translates a 
    // Windows Presentation Foundation FlowDirection value 
    // to a Windows Forms RightToLeft value and assigns
    // the result to the hosted control's RightToLeft property.
    private void OnFlowDirectionChange(object h, String propertyName, object value)
    {
        WindowsFormsHost host = h as WindowsFormsHost;
        System.Windows.FlowDirection fd = (System.Windows.FlowDirection)value;
        System.Windows.Forms.CheckBox cb = host.Child as System.Windows.Forms.CheckBox;
    
        cb.RightToLeft = (fd == System.Windows.FlowDirection.RightToLeft ) ? 
            RightToLeft.Yes : RightToLeft.No;
    }
    
    // The cb_CheckedChanged method handles the hosted control's
    // CheckedChanged event. If the Checked property is true,
    // the flow direction is set to RightToLeft, otherwise it is
    // set to LeftToRight.
    private void cb_CheckedChanged(object sender, EventArgs e)
    {
        System.Windows.Forms.CheckBox cb = sender as System.Windows.Forms.CheckBox;
    
        wfHost.FlowDirection = ( cb.CheckState == CheckState.Checked ) ? 
                System.Windows.FlowDirection.RightToLeft : 
                System.Windows.FlowDirection.LeftToRight;
    }
    

    Die ReplaceFlowDirectionMapping-Methode ersetzt die Standardzuordnung für die FlowDirection-Eigenschaft.

    Die OnFlowDirectionChange-Methode übersetzt die FlowDirection-Eigenschaft in die Windows Forms-RightToLeft-Eigenschaft.

    Die cb_CheckedChanged-Methode verarbeitet das CheckedChanged-Ereignis des CheckBox-Steuerelements. Sie weist die FlowDirection-Eigenschaft auf der Grundlage des Werts der CheckState-Eigenschaft zu.

Erweitern der Standardzuordnung einer Eigenschaft

Sie können die Standardzuordnung einer Eigenschaft verwenden und sie zudem mit Ihrer eigenen Zuordnung erweitern.

So erweitern Sie die Standardzuordnung einer Eigenschaft

  • Kopieren Sie den folgenden Code in die Window1-Klassendefinition.

    ' The ExtendBackgroundMapping method adds a property
    ' translator if a mapping already exists.
    Private Sub ExtendBackgroundMapping() 
        If wfHost.PropertyMap("Background") IsNot Nothing Then
    
            wfHost.PropertyMap("Background") = PropertyTranslator.Combine( _
            wfHost.PropertyMap("Background"), _
            PropertyTranslator.CreateDelegate( _
                GetType(PropertyTranslator), _
                Me, _
                "OnBackgroundChange"))
        End If
    
    End Sub
    
    
    ' The OnBackgroundChange method assigns a specific image 
    ' to the hosted control's BackgroundImage property.
    Private Sub OnBackgroundChange(ByVal h As Object, ByVal propertyName As String, ByVal value As Object) 
        Dim host As WindowsFormsHost = h 
        Dim cb As System.Windows.Forms.CheckBox = host.Child 
        Dim b As ImageBrush = value 
    
        If Not (b Is Nothing) Then
            cb.BackgroundImage = New System.Drawing.Bitmap("C:\WINDOWS\Santa Fe Stucco.bmp")
        End If
    
    End Sub
    
    // The ExtendBackgroundMapping method adds a property
    // translator if a mapping already exists.
    private void ExtendBackgroundMapping()
    {
        if (wfHost.PropertyMap["Background"] != null)
        {
            wfHost.PropertyMap["Background"] += new PropertyTranslator(OnBackgroundChange);
        }
    }
    
    // The OnBackgroundChange method assigns a specific image 
    // to the hosted control's BackgroundImage property.
    private void OnBackgroundChange(object h, String propertyName, object value)
    {
        WindowsFormsHost host = h as WindowsFormsHost;
        System.Windows.Forms.CheckBox cb = host.Child as System.Windows.Forms.CheckBox;
        ImageBrush b = value as ImageBrush;
    
        if (b != null)
        {
            cb.BackgroundImage = new System.Drawing.Bitmap(@"C:\WINDOWS\Santa Fe Stucco.bmp");
        }
    }
    

    Die ExtendBackgroundMapping-Methode fügt der vorhandenen Background-Eigenschaftenzuordnung einen benutzerdefinierten Eigenschaftenübersetzer hinzu.

    Die OnBackgroundChange-Methode weist der BackgroundImage-Eigenschaft des gehosteten Steuerelements ein bestimmtes Bild zu. Die OnBackgroundChange-Methode wird aufgerufen, nachdem die Standardzuordnung der Eigenschaft angewendet wurde.

Initialisieren der Eigenschaftenzuordnungen

Richten Sie die Eigenschaftenzuordnungen ein, indem Sie die zuvor beschriebenen Methoden im Loaded-Ereignishandler aufrufen.

So initialisieren Sie die Eigenschaftenzuordnungen

  1. Kopieren Sie den folgenden Code in die Window1-Klassendefinition.

    ' The WindowLoaded method handles the Loaded event.
    ' It enables Windows Forms visual styles, creates 
    ' a Windows Forms checkbox control, and assigns the
    ' control as the child of the WindowsFormsHost element. 
    ' This method also modifies property mappings on the 
    ' WindowsFormsHost element.
    Private Sub WindowLoaded( _
    ByVal sender As Object, _
    ByVal e As RoutedEventArgs)
    
        System.Windows.Forms.Application.EnableVisualStyles()
    
        ' Create a Windows Forms checkbox control and assign 
        ' it as the WindowsFormsHost element's child.
        Dim cb As New System.Windows.Forms.CheckBox()
        cb.Text = "Windows Forms checkbox"
        cb.Dock = DockStyle.Fill
        cb.TextAlign = ContentAlignment.MiddleCenter
        AddHandler cb.CheckedChanged, AddressOf cb_CheckedChanged
        wfHost.Child = cb
    
        ' Replace the default mapping for the FlowDirection property.
        Me.ReplaceFlowDirectionMapping()
    
        ' Remove the mapping for the Cursor property.
        Me.RemoveCursorMapping()
    
        ' Add the mapping for the Clip property.
        Me.AddClipMapping()
    
        ' Add another mapping for the Background property.
        Me.ExtendBackgroundMapping()
    
        ' Cause the OnFlowDirectionChange delegate to be called.
        wfHost.FlowDirection = System.Windows.FlowDirection.LeftToRight
    
        ' Cause the OnClipChange delegate to be called.
        wfHost.Clip = New RectangleGeometry()
    
        ' Cause the OnBackgroundChange delegate to be called.
        wfHost.Background = New ImageBrush()
    
    End Sub
    
    // The WindowLoaded method handles the Loaded event.
    // It enables Windows Forms visual styles, creates 
    // a Windows Forms checkbox control, and assigns the
    // control as the child of the WindowsFormsHost element. 
    // This method also modifies property mappings on the 
    // WindowsFormsHost element.
    private void WindowLoaded(object sender, RoutedEventArgs e)
    {
        System.Windows.Forms.Application.EnableVisualStyles();
    
        // Create a Windows Forms checkbox control and assign 
        // it as the WindowsFormsHost element's child.
        System.Windows.Forms.CheckBox cb = new System.Windows.Forms.CheckBox();
        cb.Text = "Windows Forms checkbox";
        cb.Dock = DockStyle.Fill;
        cb.TextAlign = ContentAlignment.MiddleCenter;
        cb.CheckedChanged += new EventHandler(cb_CheckedChanged);
        wfHost.Child = cb;
    
        // Replace the default mapping for the FlowDirection property.
        this.ReplaceFlowDirectionMapping();
    
        // Remove the mapping for the Cursor property.
        this.RemoveCursorMapping();
    
        // Add the mapping for the Clip property.
        this.AddClipMapping();
    
        // Add another mapping for the Background property.
        this.ExtendBackgroundMapping();
    
        // Cause the OnFlowDirectionChange delegate to be called.
        wfHost.FlowDirection = System.Windows.FlowDirection.LeftToRight;
    
        // Cause the OnClipChange delegate to be called.
        wfHost.Clip = new RectangleGeometry();
    
        // Cause the OnBackgroundChange delegate to be called.
        wfHost.Background = new ImageBrush();
    }
    

    Die WindowLoaded-Methode verarbeitet das Loaded-Ereignis und führt die folgende Initialisierung aus.

    • Erstellt ein Windows Forms-CheckBox-Steuerelement.

    • Ruft die Methoden auf, die Sie bereits in der exemplarischen Vorgehensweise definiert haben, um die Eigenschaftenzuordnungen einzurichten.

    • Weist den zugeordneten Eigenschaften Anfangswerte zu.

  2. Drücken Sie F5, um die Anwendung zu erstellen und auszuführen. Aktivieren Sie das Kontrollkästchen, um den Effekt der FlowDirection-Zuordnung zu beobachten. Wenn Sie das Kontrollkästchen aktivieren, kehrt das Layout seine Ausrichtung von links nach rechts um.

Siehe auch

Aufgaben

Exemplarische Vorgehensweise: Hosten eines Windows Forms-Steuerelements in Windows Presentation Foundation

Konzepte

Eigenschaftenzuordnung von Windows Forms und WPF

Referenz

WindowsFormsHost.PropertyMap

ElementHost.PropertyMap

WindowsFormsHost

Weitere Ressourcen

WPF-Designer

Migration und Interoperabilität

Beispiele für Migration und Interoperabilität