Exemplarische Vorgehensweise: Zuordnen von Eigenschaften mit dem WindowsFormsHost-Element
In dieser exemplarischen Vorgehensweise erfahren Sie, wie Sie mithilfe der PropertyMap-Eigenschaft WPF-Eigenschaften den entsprechenden Eigenschaften eines gehosteten Windows Forms-Steuerelements zuordnen.
In dieser exemplarischen Vorgehensweise werden u. a. folgende Aufgaben veranschaulicht:
Erstellen des Projekts
Definieren des Anwendungslayouts
Definieren einer neuen Eigenschaftenzuordnung
Entfernen einer standardmäßigen Eigenschaftenzuordnung
Ersetzen einer standardmäßigen Eigenschaftenzuordnung
Erweitern einer standardmäßigen Eigenschaftenzuordnung
Nach Abschluss dieser Aufgaben werden Sie in der Lage sein, WPF-Eigenschaften entsprechenden Eigenschaften eines gehosteten Windows Forms-Steuerelements zuzuordnen.
Voraussetzungen
Zum Abschließen dieser exemplarischen Vorgehensweise benötigen Sie Folgendes:
- Visual Studio 2017
Projekt erstellen und einrichten
Erstellen Sie ein WPF-App-Projekt namens
PropertyMappingWithWfhSample
.Fügen Sie im Projektmappen-Explorer einen Verweis auf die Assembly „WindowsFormsIntegration“, die den Dateinamen „WindowsFormsIntegration.dll“ hat, hinzu.
Fügen Sie im Projektmappen-Explorer einen Verweis auf die Assemblys „System.Drawing“ und „System.Windows.Forms“ hinzu.
Definieren des Anwendungslayouts
Die WPF-basierte Anwendung verwendet das WindowsFormsHost-Element zum Hosten eines Windows Forms-Steuerelements.
So definieren sie das Anwendungslayout
Öffnen Sie Window1.xaml in WPF-Designer.
Ersetzen Sie den vorhandenen Code durch folgenden Code:
<Window x:Class="PropertyMappingWithWfh.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://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>
Öffnen Sie Window1.xaml.cs im Code-Editor.
Importieren Sie am Anfang der Datei die folgenden Namespaces.
using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms; using System.Windows.Forms.Integration;
Imports System.Drawing Imports System.Drawing.Drawing2D Imports System.Windows.Forms Imports System.Windows.Forms.Integration
Definieren einer neuen Eigenschaftenzuordnung
Das WindowsFormsHost-Element stellt mehrere Standard-Eigenschaftenzuordnungen bereit. Sie fügen eine neue Eigenschaftenzuordnung hinzu, indem Sie die Add-Methode auf der PropertyMap des WindowsFormsHost-Elements aufrufen.
Definieren einer neuen Eigenschaftenzuordnung
Kopieren Sie den folgenden Code in die Definition der
Window1
-Klasse.// 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) ); }
' 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
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-Eigenschaft Region.Die
Window1_SizeChanged
-Methode behandelt das SizeChanged-Ereignis des Fensters und passt die Größe des Clippingbereichs an die des Anwendungsfensters an.
Entfernen einer standardmäßigen Eigenschaftenzuordnung
Entfernen Sie eine Standardeigenschaftenzuordnung, indem Sie die Remove-Methode auf der PropertyMap des WindowsFormsHost-Elements aufrufen.
Entfernen einer standardmäßigen Eigenschaftenzuordnung
Kopieren Sie den folgenden Code in die Definition der
Window1
-Klasse.// The RemoveCursorMapping method deletes the default // mapping for the Cursor property. private void RemoveCursorMapping() { wfHost.PropertyMap.Remove("Cursor"); }
' The RemoveCursorMapping method deletes the default ' mapping for the Cursor property. Private Sub RemoveCursorMapping() wfHost.PropertyMap.Remove("Cursor") End Sub
Die
RemoveCursorMapping
-Methode löscht die Standardzuordnung für die Cursor-Eigenschaft.
Ersetzen einer standardmäßigen Eigenschaftenzuordnung
Ersetzen Sie eine Standardeigenschaftenzuordnung, indem Sie die Standardzuordnung entfernen und die Add-Methode auf der PropertyMap des WindowsFormsHost-Elements aufrufen.
So ersetzen Sie eine standardmäßige Eigenschaftenzuordnung
Kopieren Sie den folgenden Code in die Definition der
Window1
-Klasse.// 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; }
' 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
Die
ReplaceFlowDirectionMapping
-Methode ersetzt die Standardzuordnung für die FlowDirection-Eigenschaft.Die
OnFlowDirectionChange
-Methode übersetzt die FlowDirection-Eigenschaft in die Windows Forms-Eigenschaft RightToLeft.Die
cb_CheckedChanged
-Methode behandelt das CheckedChanged-Ereignis im CheckBox-Steuerelement. Sie weist die FlowDirection-Eigenschaft basierend auf dem Wert der CheckState-Eigenschaft zu.
Erweitern einer standardmäßigen Eigenschaftenzuordnung
Sie können auch eine standardmäßige Eigenschaftenzuordnung verwenden und sie um Ihre eigenen Zuordnung erweitern.
So erweitern Sie eine standardmäßigen Eigenschaftenzuordnung
Kopieren Sie den folgenden Code in die Definition der
Window1
-Klasse.// 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"); } }
' 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
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. DieOnBackgroundChange
-Methode wird aufgerufen, nachdem die Standardzuordnung angewendet wurde.
Initialisieren der Eigenschaftenzuordnungen
Richten Sie Ihre Eigenschaftenzuordnungen durch Aufrufen der oben beschriebenen Methoden im Loaded-Ereignishandler ein.
So initialisieren Sie Ihre Eigenschaftenzuordnungen
Kopieren Sie den folgenden Code in die Definition der
Window1
-Klasse.// 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(); }
' 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
Die
WindowLoaded
-Methode behandelt das Loaded-Ereignis und führt die folgende Initialisierung durch.Erstellt ein Windows Forms-CheckBox-Steuerelement.
Sie ruft die Methoden, die Sie zuvor in der exemplarischen Vorgehensweise definiert haben, auf, um die Eigenschaftenzuordnungen einzurichten.
Sie weist den zugeordneten Eigenschaften Anfangswerte zu.
Drücken Sie F5, um die Anwendung zu erstellen und auszuführen. Klicken Sie auf das Kontrollkästchen, um die Auswirkungen der FlowDirection-Zuordnung zu beobachten. Wenn Sie das Kontrollkästchen klicken, kehrt das Layout seine Links-Rechts-Ausrichtung um.
Weitere Informationen
.NET Desktop feedback