Genomgång: Mappa egenskaper med hjälp av ElementHost-kontrollen
Den här genomgången visar hur du använder egenskapen PropertyMap för att mappa Windows Forms-egenskaper till motsvarande egenskaper i ett värdbaserat WPF-element.
Uppgifter som illustreras i den här genomgången är:
Skapa projektet.
Definiera en ny egenskapsmappning.
Tar bort en standardegenskapsmappning.
Utökar en standardegenskapskartläggning.
När du är klar kan du mappa Windows Forms-egenskaper till motsvarande WPF-egenskaper i ett värdbaserat element.
Förutsättningar
Du behöver följande komponenter för att slutföra den här genomgången:
- Visual Studio 2017
Skapa projektet
Så här skapar du projektet
Skapa ett Windows Forms App-projekt med namnet
PropertyMappingWithElementHost
.I Solution Explorerlägger du till referenser till följande WPF-sammansättningar.
PresentationCore
PresentationFramework
WindowsBase
WindowsFormsIntegration
Kopiera följande kod överst i
Form1
-kodfilen.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
Öppna
Form1
i Windows Forms Designer. Dubbelklicka på formuläret för att lägga till en händelsehanterare för händelsen Load.Gå tillbaka till Windows Forms Designer och lägg till en händelsehanterare för formulärets Resize händelse. Mer information finns under Så här: Skapa eventhanterare med hjälp av designern.
Deklarera ett ElementHost fält i klassen
Form1
.ElementHost elemHost = null;
Private elemHost As ElementHost = Nothing
Definiera nya egenskapsmappningar
Kontrollen ElementHost innehåller flera standardegenskapsmappningar. Du lägger till en ny egenskapsmappning genom att anropa metoden Add på ElementHost-kontrollens PropertyMap.
Så här definierar du nya egenskapsmappningar
Kopiera följande kod till definitionen för klassen
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
Metoden
AddMarginMapping
lägger till en ny mappning för egenskapen Margin.Metoden
OnMarginChange
översätter egenskapen Margin till egenskapen WPF Margin.Kopiera följande kod till definitionen för klassen
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
Metoden
AddRegionMapping
lägger till en ny mappning för egenskapen Region.Metoden
OnRegionChange
översätter egenskapen Region till egenskapen WPF Clip.Metoden
Form1_Resize
hanterar formulärets Resize händelse och storleksanpassar urklippsregionen så att den passar det värdbaserade elementet.
Ta bort en standardegenskapsmappning
Ta bort en standardegenskapsmappning genom att anropa metoden Remove på ElementHost-kontrollens PropertyMap.
Ta bort en standardegenskapsmappning
Kopiera följande kod till definitionen för klassen
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
Metoden
RemoveCursorMapping
tar bort standardmappningen för egenskapen Cursor.
Utöka en standardegenskapsmappning
Du kan använda en standardegenskapsmappning och även utöka den med din egen mappning.
Utöka en standardegenskapkartläggning
Kopiera följande kod till definitionen för klassen
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
Metoden
ExtendBackColorMapping
lägger till en anpassad egenskapsöversättare till den befintliga BackColor egenskapsmappningen.Metoden
OnBackColorChange
tilldelar en specifik avbildning till den värdbaserade kontrollens egenskap Background. MetodenOnBackColorChange
anropas när standardegenskapsmappningen har tillämpats.
Initiera dina mappningar av egenskaper
Kopiera följande kod till definitionen för klassen
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
Metoden
Form1_Load
hanterar händelsen Load och utför följande initiering.Skapar ett WPF-Button-element.
Anropar de metoder som du definierade tidigare i genomgången för att konfigurera egenskapsmappningarna.
Tilldelar initiala värden till de mappade egenskaperna.
Tryck på F5 för att skapa och köra programmet.
Se även
.NET Desktop feedback