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=http://schemas.microsoft.com/winfx/2006/xaml/presentation xmlns:x=http://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>
<Window x:Class="WPFApp.Window1" xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation xmlns:x=http://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 !