Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este passo a passo mostra como usar a propriedade PropertyMap para mapear propriedades do Windows Forms para propriedades correspondentes em um elemento WPF hospedado.
As tarefas ilustradas neste passo a passo incluem:
Criar o projeto.
Definindo um novo mapeamento de propriedade.
Removendo um mapeamento de propriedade padrão.
Estender um mapeamento de propriedade padrão.
Quando terminar, você poderá mapear as propriedades do Windows Forms para as propriedades do WPF correspondentes em um elemento hospedado.
Pré-requisitos
Você precisa dos seguintes componentes para concluir este passo a passo:
- Visual Studio 2017
Criando o projeto
Para criar o projeto
Criar um projeto de aplicativo do Windows Forms chamado
PropertyMappingWithElementHost.No Gerenciador de Soluções, adicione referências aos seguintes assemblies do WPF.
PresentationCore
PresentationFramework
WindowsBase
WindowsFormsIntegration
Copie o código a seguir na parte superior do
Form1arquivo de código.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.IntegrationAbra
Form1no Designer de Formulários do Windows. Clique duas vezes no formulário para adicionar um manipulador de eventos para o Load evento.Retorne ao Designer de Formulários do Windows e adicione um manipulador de eventos para o evento do Resize formulário. Para obter mais informações, consulte Como criar manipuladores de eventos usando o Designer.
Declare um campo ElementHost na classe
Form1.ElementHost elemHost = null;Private elemHost As ElementHost = Nothing
Definindo novos mapeamentos de propriedade
O ElementHost controle fornece vários mapeamentos de propriedade padrão. Você adiciona um novo mapeamento de propriedade chamando o método Add do controle ElementHostPropertyMap.
Para definir novos mapeamentos de propriedades
Copie o código a seguir para a definição da classe
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 SubO método
AddMarginMappingadiciona um novo mapeamento para a propriedade Margin.O
OnMarginChangemétodo converte a Margin propriedade para a propriedade WPF Margin .Copie o código a seguir para a definição da classe
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 SubO método
AddRegionMappingadiciona um novo mapeamento para a propriedade Region.O
OnRegionChangemétodo converte a Region propriedade para a propriedade WPF Clip .O
Form1_Resizemétodo manipula o evento do Resize formulário e dimensiona a região de recorte para se ajustar ao elemento hospedado.
Removendo um mapeamento de propriedade padrão
Remova um mapeamento de propriedade padrão chamando o método Remove no ElementHost do controle PropertyMap.
Remover um mapeamento de propriedade padrão
Copie o código a seguir para a definição da classe
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 SubO método
RemoveCursorMappingexclui o mapeamento padrão da propriedade Cursor.
Estendendo um mapeamento de propriedade padrão
Você pode usar um mapeamento de propriedade padrão e também estendê-lo com seu próprio mapeamento.
Para estender um mapeamento de propriedade padrão
Copie o código a seguir para a definição da classe
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 SubO método
ExtendBackColorMappingadiciona um tradutor de propriedade personalizado ao mapeamento de propriedade BackColor existente.O método
OnBackColorChangeatribui uma imagem específica à propriedade Background do controle hospedado. O métodoOnBackColorChangeé chamado depois que o mapeamento de propriedade padrão é aplicado.
Inicializar os mapeamentos de propriedade
Copie o código a seguir para a definição da classe
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 SubO método
Form1_Loadmanipula o evento Load e executa a inicialização a seguir.Cria um elemento WPF Button .
Chama os métodos definidos anteriormente no passo a passo para configurar os mapeamentos de propriedade.
Atribui valores iniciais às propriedades mapeadas.
Pressione F5 para compilar e executar o aplicativo.
Consulte também
.NET Desktop feedback