TOC

This article has been localized into Portuguese by the community.

Controles diversos:

O controle WindowsFormsHost

WPF e WinForms são dois frameworks de UI distintos, ambos criados pela Microsoft. O WPF é uma alternativa mais moderna ao WinForms, que foi o primeiro framework de UI do .NET. Para clarear a transição entre os dois, a Microsoft garantiu que os controles do WinForms ainda possam ser usados dentro de um aplicativo WPF. Isso é feito com o WindowsFormsHost, que discutiremos neste artigo.

Para usar o WindowsFormsHost e controles do WinForms, você precisa adicionar uma referência aos seguintes assemblies no seu aplicativo:

  • WindowsFormsIntegration
  • System.Windows.Forms

No Visual Studio, isso é feito clicando com o botão direito do mouse no nó "References" em seu projeto e selecionando "Add reference":

Na caixa de diálogo que aparece, você deve selecionar "Assemblies" e, em seguida, verificar os dois conjuntos que precisamos adicionar:

Usando o controle WinForms WebBrowser

Em um artigo anterior, usamos o controle WebBrowser do WPF para criar um pequeno navegador da web. No entanto, conforme indicado nesse artigo, o controle WPF WebBrowser é um pouco limitado quando comparado à versão do WinForms. Existem muitos exemplos em coisas facilmente feitas com a versão do WinForms, que são mais difíceis ou impossíveis de fazer com a versão do WPF.

Um pequeno exemplo é a propriedade DocumentTitle e o evento DocumentTitleChanged correspondente, o que facilita a obtenção e atualização do título da janela para corresponder ao título da página da Web atual. Usaremos isso como uma desculpa para testar a versão do WinForms aqui mesmo em nosso aplicativo WPF:

<Window x:Class="WpfTutorialSamples.Misc_controls.WindowsFormsHostSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
        Title="WindowsFormsHostSample" Height="350" Width="450">
    <Grid>
        <WindowsFormsHost Name="wfhSample">
            <WindowsFormsHost.Child>
                <wf:WebBrowser DocumentTitleChanged="wbWinForms_DocumentTitleChanged" />
            </WindowsFormsHost.Child>
        </WindowsFormsHost>
    </Grid>
</Window>
using System;
using System.Windows;

namespace WpfTutorialSamples.Misc_controls
{
	public partial class WindowsFormsHostSample : Window
	{
		public WindowsFormsHostSample()
		{
			InitializeComponent();
			(wfhSample.Child as System.Windows.Forms.WebBrowser).Navigate("http://www.wpf-tutorial.com");
		}

		private void wbWinForms_DocumentTitleChanged(object sender, EventArgs e)
		{
			this.Title = (sender as System.Windows.Forms.WebBrowser).DocumentTitle;
		}
	}
}

Preste atenção especial à linha onde adicionamos o namespace do WinForms à janela, para que possamos referenciar os controles a partir dele:

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

Isso nos permitirá referenciar os controles do WinForms usando o prefixo wf:.

O WindowsFormsHost é bastante simples de usar, como você pode ver. Ele tem uma propriedade Child, na qual você pode definir um único controle WinForms, da mesma forma que a janela WPF contém apenas um único controle raiz. Se você precisar de mais controles do WinForms dentro do seu WindowsFormsHost, você pode usar o controle Painel do WinForms ou qualquer um dos outros controles do contêiner.

O controle WinForms WebBrowser é usado referenciando o assembly System.Windows.Forms, usando o prefixo wf, como explicado acima.

Em Code-behind , fazemos uma chamada inicial para Navigate, para ter uma página da Web visível em vez do controle vazio na inicialização. Em seguida, tratamos do evento DocumentTitleChanged , no qual atualizamos a propriedade Title da janela de acordo com o valor DocumentTitle atual do controle WebBrowser.

Parabéns, agora você tem um aplicativo WPF com um WebBrowser do WinForms hospedado nele.

Resumo

Como você pode ver, usar controles WinForms dentro de seus aplicativos WPF é muito fácil, mas a questão permanece: É uma boa idéia?

Em geral, você pode querer evitar isso. Existe um grande número de problemas que podem ou não afetar seu aplicativo (alguns deles são descritos neste artigo do MSDN: http://msdn.microsoft.com/en-us/library/aa970911%28v=VS.100%29.aspx), mas um problema mais sério é que este tipo de mistura de frameworks de UI podem não ser suportadas nas versões futuras do framework .NET.

No final das contas, a decisão depende de você - você realmente precisa do controle WinForms ou há uma alternativa do WPF que funcione tão bem?


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!