• 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);
    }
    
  • 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:
    [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.