Návod: Mapování vlastností použitím ovládacího prvku ElementHost
Tento návod ukazuje, jak pomocí PropertyMap vlastnosti mapovat model Windows Forms vlastnosti na odpovídající vlastnosti hostovaného elementu WPF.
Mezi úlohy znázorněné v tomto názorném postupu patří:
Vytvoření projektu
Definování nového mapování vlastností
Odebrání výchozího mapování vlastností
Rozšíření výchozího mapování vlastností
Po dokončení budete moct mapovat model Windows Forms vlastnosti na odpovídající vlastnosti WPF v hostovaném prvku.
Předpoklady
K dokončení tohoto návodu budete potřebovat následující komponenty:
- Visual Studio 2017
Vytvoření projektu
Vytvoření projektu
Vytvořte projekt aplikace model Windows Forms s názvem
PropertyMappingWithElementHost
.V Průzkumník řešení přidejte odkazy na následující sestavení WPF.
Presentationcore
Presentationframework
Windowsbase
WindowsFormsIntegration
Zkopírujte následující kód do horní části
Form1
souboru kódu.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
Otevřete
Form1
v návrháři model Windows Forms. Poklikáním na formulář přidejte obslužnou rutinu Load události události.Vraťte se do návrháře model Windows Forms a přidejte obslužnou rutinu události pro událost formulářeResize. Další informace naleznete v tématu Postupy: Vytváření obslužných rutin událostí pomocí Návrháře.
Deklarujte ElementHost pole ve
Form1
třídě.ElementHost elemHost = null;
Private elemHost As ElementHost = Nothing
Definování nových mapování vlastností
Ovládací ElementHost prvek poskytuje několik výchozích mapování vlastností. Přidáte nové mapování vlastností voláním Add metody na ovládací prvek ElementHostPropertyMap.
Definování nových mapování vlastností
Zkopírujte následující kód do definice třídy
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
Metoda
AddMarginMapping
přidá nové mapování vlastnosti Margin .Metoda
OnMarginChange
přeloží Margin vlastnost na WPF Margin vlastnost.Zkopírujte následující kód do definice třídy
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
Metoda
AddRegionMapping
přidá nové mapování vlastnosti Region .Metoda
OnRegionChange
přeloží Region vlastnost na WPF Clip vlastnost.Metoda
Form1_Resize
zpracovává událost formuláře Resize a velikost oblasti výřezu tak, aby odpovídal hostovaný prvek.
Odebrání výchozího mapování vlastností
Odeberte výchozí mapování vlastností voláním Remove metody na ovládacím ElementHost prvku PropertyMap.
Odebrání výchozího mapování vlastností
Zkopírujte následující kód do definice třídy
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
Metoda
RemoveCursorMapping
odstraní výchozí mapování vlastnosti Cursor .
Rozšíření výchozího mapování vlastností
Můžete použít výchozí mapování vlastností a rozšířit ho také o vlastní mapování.
Rozšíření výchozího mapování vlastností
Zkopírujte následující kód do definice třídy
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
Metoda
ExtendBackColorMapping
přidá do existujícího BackColor mapování vlastností překladač vlastních vlastností.Metoda
OnBackColorChange
přiřadí konkrétní image vlastnosti hostovaného ovládacího prvku Background . MetodaOnBackColorChange
se volá po použití výchozího mapování vlastností.
Inicializace mapování vlastností
Zkopírujte následující kód do definice třídy
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
Metoda
Form1_Load
zpracovává Load událost a provádí následující inicializaci.Vytvoří prvek WPF Button .
Volá metody, které jste definovali dříve v návodu k nastavení mapování vlastností.
Přiřadí počáteční hodnoty mapovaným vlastnostem.
Stiskněte F5, aby se aplikace sestavila a spustila.
Viz také
.NET Desktop feedback