- Intégration du wpf dans du WinForms L'intégration se réalise via la classe ElementHost disponible dans l'assembly de "windowsformsintegration.dll". Cette classe "wrap" un contrôle de type "UIElement" et la rend visible dans le contexte "WinForms". Voici un exemple basique tout simple ...:
[csharp] public Form1() { InitializeComponent(); ElementHost elementHost = new ElementHost(); System.Windows.Controls.Button button = new System.Windows.Controls.Button(); button.Content = "Ok"; elementHost.Child = button; elementHost.Dock = DockStyle.Fill; Controls.Add(elementHost); }
Il existe par défaut 8 propriétés qui sont mappé entre le "container" WinForms et le contenu WPF.
- BackColor
- BackgroundImage
- BackgroundImageLayout
- Cursor
- Enabled
- Font
- RightToLeft
- Visible
Il est possible de modifier le comportement de ces mapping, d'en retirer ou d'en ajouter. Par exemple, nous souhaitons modifier le comportement de la propriété "BackColor". Il suffit de s'abonner à un evenement comme montré ci-dessous:
[csharp] if (elementHost.PropertyMap["BackColor"] != null) { elementHost.PropertyMap["BackColor"[ += new PropertyTranslator(OnBackColorChange); }et de créer la methode qui appliquera le mapping:
[csharp] 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; Color color = (Color)value; System.Windows.Media.Color wpfColor = new System.Windows.Media.Color(); wpfColor.R = color.R; wpfColor.G = color.G; wpfColor.B = color.B; wpfButton.Background = new System.Windows.Media.SolidColorBrush(wpfColor); }Pour ce qui est de l'ajout ou de la suppresion d'un mapping, il suffit d'ajouter ou de retirer un élément à la collection PropertyMap.
[csharp] elementHost.PropertyMap.Add("Region",new PropertyTranslator(OnRegionChange)); elementHost.PropertyMap.Remove("Cursor");Ces petits exemples permettront un mapping simple. Ces mappings sont par exemple utilisé lorsque l'on exécute ce code:
[csharp] elementHost.BackColor = Color.Green;Petit ps ;-)
Il est tout à fait possible d'effectuer le chemin inverse à savoir intégrer dans une application WPF des contrôles WinForms et Win32. Cela se passe via des classes bien précises suivant le même principe que celui qui est expliqué plus haut.
- WinForms : WindowsFormsHost
- Win32 : HwndHost