Procédure pas à pas : mappage de propriété à l'aide du contrôle ElementHost
Cette procédure pas à pas vous montre comment utiliser la PropertyMap propriété pour mapper les propriétés Windows Forms aux propriétés correspondantes sur un élément WPF hébergé.
Cette procédure pas à pas décrit notamment les tâches suivantes :
Création du projet.
Définition d’un nouveau mappage de propriété.
Suppression d’un mappage de propriété par défaut.
Extension d’un mappage de propriété par défaut.
Lorsque vous avez terminé, vous pourrez mapper les propriétés Windows Forms aux propriétés WPF correspondantes sur un élément hébergé.
Prérequis
Vous devez disposer des éléments suivants pour exécuter cette procédure pas à pas :
- Visual Studio 2017
Création du projet
Pour créer le projet
Créez un projet d’application Windows Forms nommé
PropertyMappingWithElementHost
.Dans Explorateur de solutions, ajoutez des références aux assemblys WPF suivants.
PresentationCore
PresentationFramework
WindowsBase
WindowsFormsIntegration
Copiez le code suivant en haut du
Form1
fichier de code.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
Ouvrez
Form1
dans le Concepteur Windows Forms. Double-cliquez sur le formulaire pour ajouter un gestionnaire d’événements pour l’événement Load .Revenez au Concepteur Windows Forms et ajoutez un gestionnaire d’événements pour l’événement du Resize formulaire. Pour plus d’informations, consultez Guide pratique pour créer des gestionnaires d’événements à l’aide du concepteur.
Déclarez un ElementHost champ dans la
Form1
classe.ElementHost elemHost = null;
Private elemHost As ElementHost = Nothing
Définition de nouveaux mappages de propriétés
Le ElementHost contrôle fournit plusieurs mappages de propriétés par défaut. Vous ajoutez un nouveau mappage de propriétés en appelant la Add méthode sur le ElementHost contrôle PropertyMap.
Pour définir de nouveaux mappages de propriétés
Copiez le code suivant dans la définition de la
Form1
classe.// 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
La
AddMarginMapping
méthode ajoute un nouveau mappage pour la Margin propriété.La
OnMarginChange
méthode traduit la Margin propriété en propriété WPF Margin .Copiez le code suivant dans la définition de la
Form1
classe.// 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
La
AddRegionMapping
méthode ajoute un nouveau mappage pour la Region propriété.La
OnRegionChange
méthode traduit la Region propriété en propriété WPF Clip .La
Form1_Resize
méthode gère l’événement du formulaire et dimensionne la zone de Resize découpage pour qu’elle corresponde à l’élément hébergé.
Suppression d’un mappage de propriété par défaut
Supprimez un mappage de propriétés par défaut en appelant la Remove méthode sur le ElementHost contrôle PropertyMap.
Pour supprimer un mappage de propriété par défaut
Copiez le code suivant dans la définition de la
Form1
classe.// 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
La
RemoveCursorMapping
méthode supprime le mappage par défaut de la Cursor propriété.
Extension d’un mappage de propriété par défaut
Vous pouvez utiliser un mappage de propriété par défaut et l’étendre avec votre propre mappage.
Pour étendre un mappage de propriété par défaut
Copiez le code suivant dans la définition de la
Form1
classe.// 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
La
ExtendBackColorMapping
méthode ajoute un traducteur de propriétés personnalisé au mappage de propriétés existant BackColor .La
OnBackColorChange
méthode affecte une image spécifique à la propriété du Background contrôle hébergé. LaOnBackColorChange
méthode est appelée après l’application du mappage de propriétés par défaut.
Initialiser vos mappages de propriétés
Copiez le code suivant dans la définition de la
Form1
classe.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
La
Form1_Load
méthode gère l’événement Load et effectue l’initialisation suivante.Crée un élément WPF Button .
Appelle les méthodes que vous avez définies précédemment dans la procédure pas à pas pour configurer les mappages de propriétés.
Assigne les valeurs initiales aux propriétés mappées.
Appuyez sur F5 pour générer et exécuter l’application.
Voir aussi
.NET Desktop feedback