Accéder au contenu principal

How to integrate WPF in Winforms and Vice versa

In french please !!!!
 
Enjoy
 
 
L'utilisation de WPF ne se réduit pas à de nouveaux projets. En effet, il est tout à fait possible d'adapter un rendu en fonction de la version du framework .NET disponible sur la machine client. On pourrait avoir à disposition une librairie de génération de graphiques en GDI qui s'affiche si l'utilisateur final n'a pas .NET 3. Cela offrirait de nouvelles possibilités à un logiciel existant tout en garantissant un minimum de compatibilité. C'est ainsi que j'expose en quelques lignes comment intégrer un composant WPF dans une application WinForms et comment mapper des propriétés (que j'expliquerai plus tard dans ce post ;-).
  • 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 ...:
     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); }
  • Intégration de WPF dans une application Win32 L'intrégration se réalise de la même façon que pour le WinForms. On passe via un "wrapper" qui dans ce cas-ci se nomme HwndSource.
  • Mappage de propriétés du "container" ecrit en WinForms avec son contenu WPF
    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:
     if (elementHost.PropertyMap["BackColor"] != null) {      elementHost.PropertyMap["BackColor"[ += new PropertyTranslator(OnBackColorChange); }
    et de créer la methode qui appliquera le mapping:
    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.
    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:
    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

--
Alain Lompo
Excelta - Conseils et services informatiques
MCT
MCSD For Microsoft .Net
MVP Windows Systems Server / Biztalk Server
Certifié ITIL et Microsoft Biztalk Server

Commentaires

Articles les plus consultés