Desenvolvimento - C#
Utilizando controles WPF em aplicações Windows Forms
O Windows Presentation Foundation (ou WPF), inicialmente chamado de “Avalon” é um dos pilares do .Net Framework 3.0. Esse pilar é responsável pelo novo estilo da camada de apresentação nesse Framework.
por André Alves de Lima1. Introdução
O Windows Presentation Foundation (ou WPF), inicialmente chamado de “Avalon” é um dos pilares do .Net Framework 3.0. Esse pilar é responsável pelo novo estilo da camada de apresentação nesse Framework.
Com o aparecimento dessa nova tecnologia, surge a seguinte dúvida: Para utilizar WPF em minhas aplicações já desenvolvidas em Windows Forms, é necessário desenvolver toda a aplicação novamente?
Em um ambiente em que o desenvolvimento das aplicações é feito utilizando camadas, a migração de Windows Forms para WPF tende a ser bastante tranqüila.
Mas, como nem todos têm o privilégio de desenvolver em um ambiente que preze o desenvolvimento em camadas, onde a camada de apresentação deve possuir somente elementos de interface, tende-se a pensar que a migração é impraticável.
Pensando nisso, juntamente com o WPF, temos algumas DLLs que viabilizam a utilização de controles desenvolvidos utilizando WPF em aplicações Windows Forms.
Neste artigo, criaremos um simples controle utilizando WPF e abordaremos como é feita essa integração.
2. Criando um componente WPF
Com o Visual Studio 2005 (utilizamos a versão Standard neste artigo), ou CTP do Visual Studio Orcas, o .Net Framework 3.0 e as extensões do WPF & WCF para Visual Studio 2005 instaladas, surge na tela New Project, uma outra classe de projetos, que corresponde a projetos do .Net Framework 3.0, como mostra a figura abaixo.
Fig. 1: Nova categoria de Projetos: NET Framework 3.0
Os novos tipos de projetos disponíveis são:
- Windows Application (WPF): cria uma aplicação WPF;
- XAML Browser Application (WPF): cria uma página web que utiliza WPF;
- Custom Control Library (WPF): cria um User Control WPF;
- WCF Service Library: cria um serviço WCF.
Como queremos criar um controle WPF, precisamos selecionar o tipo de projeto “Custom Control Library (WPF)”.
Ao criarmos o projeto, temos que estender uma área para construir nosso User Control. Estenda a área, adicione 2 TextBoxes e um Button de forma que a tela fique parecida com a tela abaixo.
Fig. 2: Layout do User Control
Caso você prefira, utilize o código XAML abaixo, que representa o layout do nosso User Control.
XAML
<UserControl x:Class="LibraryWPFDemo.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Height="224" Width="297">
<Grid>
<TextBox Height="26" Margin="32,33,52,0" Name="textBox1" VerticalAlignment="Top" ></TextBox>
<Button Height="23" Margin="32,67,53,0" Name="button1" VerticalAlignment="Top">Button</Button>
<TextBox Margin="33,95,54,51" Name="textBox2" Text="Exemplo WPF Dot Net Raptors"></TextBox>
</Grid>
</UserControl>
Para nosso User Control ter alguma funcionalidade, precisamos criar um Event Handler para o botão. A idéia é que, ao clicarmos no botão, o texto do textBox2 seja alterado para o seu próprio texto mais o texto que estiver digitado no textBox1. Vamos então criar o método que irá tratar esse evento no Code Behind do User Control (que é o arquivo de extensão .cs ou .vb que fica abaixo do arquivo XAML na tela Solution Explorer):
C#
public void cliqueDoBotao(object sender, EventArgs e)
{
// Modifica o texto do textBox2 para o texto do textBox2 mais o texto do textBox1.
textBox2.Text = textBox2.Text + " " + textBox1.Text;
}
VB.NET
Private Sub cliqueDoBotao(ByVal sender As System.Object, ByVal e As System.EventArgs)
" Modifica o texto do TextBox2 para o texto do TextBox2 mais o texto do TextBox1.
TextBox2.Text = TextBox2.Text + " " + TextBox1.Text
End Sub
Para completar nosso User Control, precisamos associar o evento Click do button1 com o Event Handler criado. Para isso, modificamos a linha que representa o botão no código XAML, adicionando a instrução de tratamento do Click:
XAML
<Button Height="23" Margin="32,67,53,0" Name="button1" VerticalAlignment="Top" Click="cliqueDoBotao">Button</Button>
Feito isso, temos nosso User Control pronto. Vamos partir agora para a criação da nossa Windows Forms Application que conterá esse User Control criado.
2. Criando uma aplicação Windows Forms para hospedar o controle WPF
Adicionemos uma Windows Application em nossa solução utilizando File à Add à New Project.
Inicialmente, precisamos incluir as DLLs que fazem a integração do WPF com o Windows Forms. Façamos isso clicando em Project à Add à Reference à Browse. As DLLs que precisamos são as listadas abaixo. Elas estão localizadas na pasta Arquivos de Programas\Reference Assemblies\Microsoft\Framework\v3.0\:
- PresentationCore
- PresentationFramework
- UIAutomationProvider
- UIAutomationTypes
- WindowsBase
- WindowsFormsIntegration
Adicionadas as referências para essas DLLs, precisamos adicionar também a referência ao nosso User Control, que pode ser adicionada utilizando Project à Add à Reference à Projects.
Para hospedar nosso User Control, vamos criar um Panel (panel1) em nosso Form e implementar um Handler para o evento Load do nosso Form, que será o responsável por carregar o controle WPF dentro do panel1:
C#
private void Form1_Load(object sender, EventArgs e)
{
// Criando um ElementHost, que conterá o nosso UserControl.
System.Windows.Forms.Integration.ElementHost _host = new System.Windows.Forms.Integration.ElementHost();
// Criando um objeto do tipo do nosso UserControl.
LibraryWPFDemo.UserControl1 _uc1 = new LibraryWPFDemo.UserControl1();
// Ajustando o Host para que o controle ocupe toda a área dele.
_host.Dock = DockStyle.Fill;
// Configurando o Host para que o conteúdo dele seja nosso UserControl.
_host.Child = _uc1;
// Adicionando o Host em nosso UserControl.
panel1.Controls.Add(_host);
}
VB.NET
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
" Criando um ElementHost, que conterá o nosso UserControl.
Dim _host As System.Windows.Forms.Integration.ElementHost = New System.Windows.Forms.Integration.ElementHost
" Criando um objeto do tipo do nosso UserControl.
Dim _uc1 As LibraryWPFDemo.UserControl1 = New LibraryWPFDemo.UserControl1
" Ajustando o Host para que o controle ocupe toda a área dele.
_host.Dock = DockStyle.Fill
" Configurando o Host para que o conteúdo dele seja nosso UserControl.
_host.Child = _uc1
" Adicionando o Host em nosso UserControl.
panel1.Controls.Add(_host)
End Sub
Com todos esses passos implementados, podemos dar um Build Solution e rodar nossa aplicação. Com tudo isso feito, ao rodar a aplicação temos nosso Form com o controle WPF criado anteriormente, como mostra a figura abaixo:
Fig. 3: Aplicação Windows Forms com controle WPF
Com esses passos, podemos migrar nossa aplicação Windows Forms aos poucos, sem a necessidade de ter que refazer por completo nossa solução.
Vamos ficando por aqui. Espero que tenham gostado e, até a próxima!