Procédure pas à pas : mappage de propriété à l'aide du contrôle ElementHost
Mise à jour : novembre 2007
Cette procédure pas à pas montre comment utiliser la propriété PropertyMap pour mapper des propriétés Windows Forms à des propriétés correspondantes sur un élément WPF hébergé.
Cette procédure pas à pas illustre 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.
Pour obtenir l'intégralité du code correspondant aux tâches illustrées dans cette procédure pas à pas, consultez Mappage de propriétés à l'aide du contrôle ElementHost, exemple.
À la fin de cette procédure, vous saurez mapper des propriétés Windows Forms à des propriétés correspondantes sur un élément WPF hébergé.
Remarque Les boîtes de dialogue et les commandes de menu qui s'affichent peuvent être différentes de celles qui sont décrites dans l'aide, en fonction de vos paramètres actifs ou de l'édition utilisée. Pour modifier vos paramètres, choisissez Importation et exportation de paramètres dans le menu Outils. Pour plus d'informations, consultez Paramètres Visual Studio.
Composants requis
Les composants suivants sont nécessaires pour exécuter cette procédure pas à pas :
- Visual Studio 2008.
Création du projet
Pour créer le projet
Créez un projet d'application Windows Forms nommé PropertyMappingWithElementHost. Pour plus d'informations, consultez Comment : créer un projet d'application Windows.
Dans l'Explorateur de solutions, ajoutez une référence aux assemblys WPF suivants.
PresentationCore
PresentationFramework
WindowsBase
WindowsFormsIntegration
Copiez le code suivant en haut du fichier de code Form1.
Imports System.Windows Imports System.Windows.Media Imports System.Windows.Media.Imaging Imports System.Windows.Forms.Integration
using System.Windows; using System.Windows.Media; using System.Windows.Media.Imaging; using 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 Resize du formulaire. Pour plus d'informations, consultez Comment : créer des gestionnaires d'événements à l'aide du concepteur.
Déclarez un champ ElementHost dans la classe Form1.
Private elemHost As ElementHost = Nothing
ElementHost elemHost = null;
Définition de nouveaux mappages de propriétés
Le contrôle ElementHost fournit plusieurs mappages de propriétés par défaut. Vous ajoutez un nouveau mappage de propriété en appelant la méthode Add sur le PropertyMap du contrôle ElementHost.
Pour définir de nouveaux mappages de propriétés
Copiez le code suivant dans la définition de la classe Form1.
' 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
// 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; }
La méthode AddMarginMapping ajoute un nouveau mappage à la propriété Margin.
La méthode OnMarginChange traduit la propriété Margin en propriété WPFMargin.
Copiez le code suivant dans la définition de la classe Form1.
' 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 Me.OnRegionChange(elemHost, "Region", Nothing) End Sub
// 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); }
La méthode AddRegionMapping ajoute un nouveau mappage à la propriété Region.
La méthode OnRegionChange traduit la propriété Region en propriété WPFClip.
La méthode Form1_Resize gère l'événement Resize du formulaire et ajuste la taille de la zone de découpage à l'élément hébergé.
Suppression d'un mappage de propriété par défaut
Supprimez un mappage de propriété par défaut en appelant la méthode Remove sur le PropertyMap du contrôle ElementHost.
Pour supprimer un mappage de propriété par défaut
Copiez le code suivant dans la définition de la classe Form1.
' The RemoveCursorMapping method deletes the default ' mapping for the Cursor property. Private Sub RemoveCursorMapping() elemHost.PropertyMap.Remove("Cursor") End Sub
// The RemoveCursorMapping method deletes the default // mapping for the Cursor property. private void RemoveCursorMapping() { elemHost.PropertyMap.Remove("Cursor"); }
La méthode RemoveCursorMapping supprime le mappage par défaut pour la propriété Cursor.
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 classe Form1.
' 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
// 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; }
La méthode ExtendBackColorMapping ajoute un traducteur de propriété personnalisé au mappage de propriété BackColor existant.
La méthode OnBackColorChange affecte une image spécifique à la propriété Background du contrôle hébergé. La méthode OnBackColorChange est appelée après application du mappage de propriété par défaut.
Initialisation de vos mappages de propriété
Pour initialiser vos mappages de propriété
Copiez le code suivant dans la définition de la classe Form1.
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
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; }
La méthode Form1_Load traite l'événement Load et exécute l'initialisation suivante.
Crée un élément ButtonWPF.
Appelle la méthode que vous avez définie précédemment au cours de cette procédure pour paramétrer les mappages de propriété.
Affecte des valeurs initiales aux propriétés mappées.
Appuyez sur F5 pour générer et exécuter l'application.
Voir aussi
Concepts
Mappage de propriétés Windows Forms et WPF