Integrando WPF em aplicações Windows Forms e vice-versa

Pessoal,

Apresentei a alguns dias atrás um webcast falando a integração de controles WPF em aplicações Windows Forms e controles Windows Forms em aplicações WPF.

Vou resumir aqui os principais pontos que foram apresentados.

Por que a interoperabilidade entre WPF e Windows Forms?
Primeiro porque a adoção completa do WPF nem sempre ocorre em todas as aplicações Window Forms, devido ao investimento em controles ou aplicações Windows Forms; segundo é que em cenário de migração/upgrade para WPF, existe a possibilidade de uso incremental e de acordo com as necessidades  das capacidades do WPF. Outra ponto para ajudar na resposta, é que até o momento nós temos mais controles no toolbox em Windows Forms do que WPF (exemplos: DataGridView/DataGrid, BindingNavigator, ColorDialog, DateTimePicker, ErrorProvider, FontDialog, FolderBrowserDialog, MaskedTextBox, etc).

Como hospedar controle WPF em Windows Forms?
Você deve usar o controle ElementHost que funciona como controle de renderização para o elemento WPF hospedado dentro de um formulário ou outro controle e expõem as propriedades do controle hospedado. Assim que você adicionar o controle ElementHost no formulário, as seguintes referências são adicionadas ao seu projeto:

PresentationCore
PresentationFramework
WindowsBase
WindowsFormsIntegration

Segue um exemplo de código onde crio um controle WPF em runtime e o controle ElementHost é o elementHost1:

Expander exp = new Expander();
exp.Header = "Texto do Header";
exp.Content = "Conteúdo do Controle WPF";
elementHost1.Child = exp;

Como hospedar controle Windows Forms em WPF?
Você deve usar o elemento WindowsFormsHost que funciona como um container de renderização de controles windows forms dentro de uma janela, controle ou página WPF. Da mesma maneira que o ElementHost, expõem as propriedades do controle hospedado. Segue um exemplo de código onde eu utilizo um controle customizado (Windows Forms) dentro de uma janela WPF:

<Window x:Class="WPFApp.Window1" xmlns=https://schemas.microsoft.com/winfx/2006/xaml/presentation
xmlns:x=https://schemas.microsoft.com/winfx/2006/xaml
xmlns:cc="clr-namespace:CustomControls;assembly=CustomControls"
Title="WPFApp" Height="431" Width="715">
...

<WindowsFormsHost Grid.Column="1" Grid.Row="1">
<cc:CustomGrid x:Name="m_CustomGrid"/>
</WindowsFormsHost>

 

Aguarde aqui o link para o webcast gravado.

Bons códigos e até o próximo post !