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 Lima



1. 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!

André Alves de Lima

André Alves de Lima - http://andrealveslima.spaces.live.com