25

Sep

Come mettere in binding il Child (il controllo WindowsForms) del WindowsFormsHost di WPF

Ciao a tutti

 

In rari casi è necessario utilizzare un controllo WindowsForms (magari perché è COM) da un’applicazione WPF

In questi casi però è ancora più seccante dover programmare dal code-behind un’eventuale assegnazione automatica del controllo WindowsForms contenuto nell’host

 

Una soluzione di esempio è quella di utilizzare un Behavior che ci consente di aggiungere una DependencyProperty da poter poi gestire dal Behavior stesso lasciando il controllo originale inalterato, e contemporaneamente lasciandoci la possibilità di usare un Binding da una nostra classe (o ViewModel – anche se non particolarmente felici di ospitare al loro interno altri controlli…)

 

1) Aggiungiamo il riferimento all’assembly System.Windows.Interactivity in genere incluso in Microsoft Blend

2) Aggiungiamo il Behavior alla nostra applicazione

 

public class WindowsFormsHostChildBehavior : Behavior
{
    public static readonly DependencyProperty ChildProperty = DependencyProperty.Register("Child",
        typeof(Control), typeof(WindowsFormsHostChildBehavior));

    public Control Child
    {
        get { return (Control)GetValue(ChildProperty); }
        set { SetValue(ChildProperty, value); }
    }

    protected override void OnAttached()
    {
        base.OnAttached();

        AssociatedObject.Loaded += AssociatedObject_Loaded;
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();
        AssociatedObject.Loaded -= AssociatedObject_Loaded;
    }

    void AssociatedObject_Loaded(object sender, RoutedEventArgs e)
    {
        AssociatedObject.Child = Child;
    }
}

il behavior ha il compito di esporre una proprietà bindabile per il Child del WindowsFormsHost, e di collegarlo in fase di load del controllo (ad esempio)

 

3) Dichiariamo gli assembly necessari nel nostro XAML per creare il WindowsFormsHost

 

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:me="clr-namespace:WindowsFormsHostBehaviorApplication"

il “me” rappresenta il proprio assembly

 

4) Aggiungiamo il WindowsFormsHost ed il relativo Behavior


   
       
   

 

DOWNLOAD

 

spero sia utile come esempio

a presto

by Antonio Esposito on 9/25/2012