Exemplarische Vorgehensweise: Zuordnen von Eigenschaften mit dem ElementHost-Steuerelement
Aktualisiert: November 2007
In dieser exemplarischen Vorgehensweise wird veranschaulicht, wie Sie mithilfe der PropertyMap-Eigenschaft die Windows Forms-Eigenschaften den entsprechenden Eigenschaften eines gehosteten WPF-Elements zuordnen.
Zu den in dieser exemplarischen Vorgehensweise erläuterten Aufgaben gehören:
Erstellen des Projekts.
Definieren einer neuen Eigenschaftenzuordnung.
Entfernen der Standardzuordnung einer Eigenschaft.
Erweitern der Standardzuordnung einer Eigenschaft.
Eine vollständige Codeauflistung der in dieser exemplarischen Vorgehensweise veranschaulichten Aufgaben finden Sie unter Beispiel für das Zuordnen von Eigenschaften mit dem ElementHost-Steuerelement.
Nach Abschluss können Sie Windows Forms-Eigenschaften den entsprechenden WPF-Eigenschaften eines gehosteten Elements 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
Erstellen Sie ein Windows Forms-Anwendungsprojekt mit dem Namen PropertyMappingWithElementHost. Weitere Informationen finden Sie unter Gewusst wie: Erstellen eines Windows-Anwendungsprojekts.
Fügen Sie im Projektmappen-Explorer Verweise zu den folgenden WPF-Assemblys hinzu.
PresentationCore
PresentationFramework
WindowsBase
WindowsFormsIntegration
Kopieren Sie den folgenden Code in den Anfang der Codedatei 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;
Öffnen Sie Form1 im Windows Forms-Designer. Doppelklicken Sie auf das Formular, um einen Ereignishandler für das Load-Ereignis hinzuzufügen.
Kehren Sie zum Windows Forms-Designer zurück, und fügen Sie einen Ereignishandler für das Resize-Ereignis des Formulars hinzu. Weitere Informationen finden Sie unter Gewusst wie: Erstellen von Ereignishandlern mithilfe des Designers.
Deklarieren Sie ein ElementHost-Feld in der Form1-Klasse.
Private elemHost As ElementHost = Nothing
ElementHost elemHost = null;
Definieren neuer Eigenschaftenzuordnungen
Das ElementHost-Steuerelement stellt mehrere Standardzuordnungen von Eigenschaften bereit. Sie fügen eine neue Eigenschaftenzuordnung hinzu, indem Sie die Add-Methode in der PropertyMap des ElementHost-Steuerelements aufrufen.
So definieren Sie neue Eigenschaftenzuordnungen
Kopieren Sie den folgenden Code in die Form1-Klassendefinition.
' 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; }
Die AddMarginMapping-Methode fügt eine neue Zuordnung für die Margin-Eigenschaft hinzu.
Die OnMarginChange-Methode übersetzt die Margin-Eigenschaft in die WPF-Margin-Eigenschaft.
Kopieren Sie den folgenden Code in die Form1-Klassendefinition.
' 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 Me.OnRegionChange(elemHost, "Region", Nothing) 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); }
Die AddRegionMapping-Methode fügt eine neue Zuordnung für die Region-Eigenschaft hinzu.
Die OnRegionChange-Methode übersetzt die Region-Eigenschaft in die WPF-Clip-Eigenschaft.
Die Form1_Resize-Methode behandelt das Resize-Ereignis des Formulars und passt die Größe des Clippingbereichs an das gehostete Element an.
Entfernen der Standardzuordnung einer Eigenschaft
Sie entfernen die Standardzuordnung einer Eigenschaft, indem Sie die Remove-Methode für die PropertyMap des ElementHost-Steuerelements aufrufen.
So entfernen Sie die Standardzuordnung einer Eigenschaft
Kopieren Sie den folgenden Code in die Form1-Klassendefinition.
' 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"); }
Die RemoveCursorMapping-Methode löscht die Standardzuordnung für die Cursor-Eigenschaft.
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 Form1-Klassendefinition.
' 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; }
Die ExtendBackColorMapping-Methode fügt der vorhandenen BackColor-Eigenschaftenzuordnung einen benutzerdefinierten Eigenschaftenübersetzer hinzu.
Die OnBackColorChange-Methode weist der Background-Eigenschaft des gehosteten Steuerelements ein bestimmtes Bild zu. Die OnBackColorChange-Methode wird aufgerufen, nachdem die Standardzuordnung der Eigenschaft angewendet wurde.
Initialisieren der Eigenschaftenzuordnungen
So initialisieren Sie die Eigenschaftenzuordnungen
Kopieren Sie den folgenden Code in die Form1-Klassendefinition.
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; }
Die Form1_Load-Methode behandelt das Load-Ereignis und führt die folgende Initialisierung aus.
Erstellt ein WPF-Button-Element.
Ruft die Methoden auf, die Sie bereits in der exemplarischen Vorgehensweise zum Festlegen der Eigenschaftenzuordnungen definiert haben.
Weist den zugeordneten Eigenschaften Anfangswerte zu.
Drücken Sie F5, um die Anwendung zu erstellen und auszuführen.
Siehe auch
Konzepte
Eigenschaftenzuordnung von Windows Forms und WPF