Tutorial: Asignar propiedades mediante el uso del control ElementHost
En este tutorial se muestra cómo usar la propiedad PropertyMap para asignar propiedades de Windows Forms a las propiedades correspondientes de un elemento hospedado de WPF.
Las tareas ilustradas en este tutorial incluyen:
Crear el proyecto.
Definir una nueva asignación de propiedades.
Quitar una asignación de propiedades predeterminada.
Extender una asignación de propiedades predeterminada.
Cuando haya terminado, podrá asignar propiedades de Windows Forms a las propiedades correspondientes de WPF en un elemento hospedado.
Requisitos previos
Necesitará los componentes siguientes para completar este tutorial:
- Visual Studio 2017
Crear el proyecto
Para crear el proyecto
Cree un proyecto de aplicación de Windows Forms llamado
PropertyMappingWithElementHost
.En el Explorador de soluciones, agregue referencias a los ensamblados de WPF siguientes.
PresentationCore
PresentationFramework
WindowsBase
WindowsFormsIntegration
Copie el código siguiente en la parte superior del archivo de código
Form1
.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
Abra
Form1
en el Diseñador de Windows Forms. Haga doble clic en el formulario para crear un controlador de eventos para el evento Load.Vuelva al Diseñador de Windows Forms y agregue un controlador de eventos para el evento Resize del formulario. Para obtener más información, consulte Cómo: Crear controladores de eventos mediante el diseñador.
Declare un campo ElementHost en la clase
Form1
.ElementHost elemHost = null;
Private elemHost As ElementHost = Nothing
Definición de nuevas asignaciones de propiedades
El control ElementHost proporciona varias asignaciones de propiedades predeterminadas. Para agregar una nueva asignación de propiedades, llame al método Add en la propiedad PropertyMap del control ElementHost.
Para definir una nueva asignación de propiedades
Copie el código siguiente en la definición de la clase
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
El método
AddMarginMapping
agrega una asignación nueva para la propiedad Margin.El método
OnMarginChange
convierte la propiedad Margin en la propiedad Margin de WPF.Copie el código siguiente en la definición de la clase
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
El método
AddRegionMapping
agrega una asignación nueva para la propiedad Region.El método
OnRegionChange
convierte la propiedad Region en la propiedad Clip de WPF.El método
Form1_Resize
controla el evento Resize del formulario y cambia el tamaño de la zona de recorte para ajustarla al elemento hospedado.
Quitar una asignación de propiedades predeterminada
Quite una asignación de propiedades predeterminada llamando al método Remove en la propiedad PropertyMap del control ElementHost.
Para quitar una asignación de propiedades predeterminada
Copie el código siguiente en la definición de la clase
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
El método
RemoveCursorMapping
elimina la asignación predeterminada para la propiedad Cursor.
Extender una asignación de propiedades predeterminada
Puede usar una asignación de propiedades predeterminada y extenderla con su propia asignación.
Para extender una asignación de propiedades predeterminada
Copie el código siguiente en la definición de la clase
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
El método
ExtendBackColorMapping
agrega un traductor de propiedades personalizadas a la asignación de propiedades BackColor existente.El método
OnBackColorChange
asigna una imagen específica a la propiedad Background del control hospedado. El métodoOnBackColorChange
se llama después de aplicar la asignación de propiedades predeterminada.
Inicialización de las asignaciones de propiedades
Copie el código siguiente en la definición de la clase
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
El método
Form1_Load
controla el evento Load y efectúa la siguiente inicialización.Crea un elemento Button de WPF.
Llama a los métodos definidos anteriormente en el tutorial para configurar las asignaciones de propiedades.
Asigna los valores iniciales a las propiedades asignadas.
Presione F5 para compilar y ejecutar la aplicación.
Vea también
.NET Desktop feedback