Interoperacyjność

Z WPF do WinForms

WPF przychodzi z możliwością użycia kontrolek WPF w aplikacji WinForms. Możemy nasze WinFormsowe aplikacje pomału przebudowywać korzystając z dobrodziejstw WPF. Robimy to za pomocą kontrolki ElementHost. Przykład:

var expander  = new Expander();           

var panel = new StackPanel();

expander.Content = panel;

panel.Children.Add(new Button {Content = new TextBlock {Text = “Button1”}});

panel.Children.Add(new Button { Content = new TextBlock { Text = “Button2” } });

panel.Children.Add(new Button { Content = new TextBlock { Text = “Button3” } });

Tworzymy w nim kontrolkę Expander wraz ze StackPanelem, który zawiera kilka przycisków. Standardowe kontrolki WPF. Teraz zacznie się magia :). Wrzućmy sobie na formę WinForms ElementHost i przypiszmy naszą kontrolkę:

elementHost1.Child = expander; 

A po uruchomieniu będzie to wyglądać następująco:

Oczywiście możemy podpinać się do event’ów kontrolek WPF’a i reagować na nie.

expander.Expanded += expander_Expanded;

void expander_Expanded(object sender, System.Windows.RoutedEventArgs e)

{

    MessageBox.Show(“Expanded”);

}

Z WinForms do WPF

Jeśli mamy potrzebę użycia czegoś co dostępne jest w WPF, również możemy to uczynić. WindowsFormsHost na to nam pozwala. Używamy tegop w następujący sposób. Dodajemy referencję do dll’ki i rejestrujemy namespace w XAMLu.

xmlns:Forms=”clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms”

A następnie po prostu używamy:

<WindowsFormsHost Name=”windowsFormsHost1″ >

    <Forms:MaskedTextBox Mask=”99-999″ />

WindowsFormsHost>

I po uruchomieniu możemy używać kontrolki MaskedTextBox w WPF.

Jeśli chcemy użyć akceleratorów to standardowo do ich deklarowania w WinForms używa się znaku &. Oczywiście w XAMLu nie możemy tego zrobić. Musimy posłużyć się & Jak w przykładzie poniżej:

<Forms:Button Text=”Use Alt+&A” Click=”Button_Click”/>

Kilka dodatków

Używając WPF w WinForm i vice versa musimy liczyć się z tym, że niektóre właściwości będą się różnic np. w WinForms mamy BackColor w WPF Backgroud. Musimy pamiętać o takich rozbieżnościach bawiąc się w łączenie WPF i WinForms.

W następnym odcinku będzie o user kontrolkach.