This article is currently in the process of being translated into Spanish (~99% done).
The WindowsFormsHost control
WPF y WinForms son dos UI frameworks distintos, ambos creados por Microsoft. WPF esta pensado mas como una alternativa moderna a WinForms, que fue el primer UI framework. Para una transición suave entre los dos, Microsoft se ha asegurado que los controls de Winforms se puedan seguir usando dentro de una aplicacion WPF. Esto es lo que se ha hecho con WindowsFormsHost y es lo que discutiremos en este artículo.
Para usar WindowsFormsHost y los controles desde WinForms, es necesario añadir los siguientes ensamblados en vuestra aplicación:
- WindowsFormsIntegration
- System.Windows.Forms
En Visual Studio, En el explorador de soluciones te ubicas en el nodo del proyecto. Luego das click derecho y en la opción "Referencias" seleccionas "Añadir Referencia"
En el dialogo de la ventana emergente, debes seleccionas "Ensamblados y entonces seleccionar los dos ensamblados que nosotros necesitamos añadir:
Usar el control WinForms WebBrowser.
En el artículo anterior, nosostros usamos el control WebBrowser de WPF para crear un pequeño navegador web. Sin embargo, como se menciona en este artículo. el control WebBrowser de WPF es limitado cuando lo comparamos con la versión de WinForms. Hay muchos ejemplos fáciles de implementar con la versión de WinForms que seria muy difícil o imposible de realizar con la versión de WPF.
Un pequeño ejemplo es la propiedad DocumentTitle y el correspondiente evento DocumentTitleChanged, que se hace fácilmente para obtener y actualizar el titulo de la ventana para que coincida con el título de la pagina web actual. Nosotros usaremos esto como una excusa para probar la versión WinForms justo aquí en nuestra aplicación 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;
}
}
}
Hay que prestar especial atención a la linea que nosotros añadimos al WinForms namespace de la ventana, para que podamos hacer referencia a esta.
xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
Esto nos permitirá usar la referencia a los controles de WinForms con el prefijo wf:
El WindowsFormsHost es bastante facil para usar, como puedes ver. Este tiene una propiedad hija, en la cual tu defines un control WindowsForm, mas parecido a el WPF. Windows unicamente soporta un control raiz. Si necesitas mas de un control desde WinForms dentro de control WindowsFormsHost, tu puedes usar control Panel desde Winforms o alguno otro control contenedor.
El control WinForms WebBrowser es usado referenciando el ensamblado System.Windows.Forms, usando el prefijo wf, como explicamos arriba.
En Código subyacente , hacemos una llamada inicial a Navegar, para tener una página web visible en lugar del control vacío al inicio. Luego manejamos el evento DocumentTitleChanged , en el que actualizamos la propiedad Título de la ventana de acuerdo con el valor actual DocumentTitle del control WebBrowser.
Felicitaciones, ahora tiene una aplicación WPF con un WinForms WebBrowser alojado dentro de ella.
Resumen
Como puede ver, usar los controles WinForms dentro de sus aplicaciones WPF es bastante fácil, pero la pregunta sigue siendo: ¿Es una buena idea?
En general, es posible que desee evitarlo. Existen varios problemas que pueden afectar o no su aplicación (muchos de ellos se describen en este MSDN artículo: http://msdn.microsoft.com/en-us/ library / aa970911% 28v = VS.100% 29.aspx ), pero un problema más grave es que este tipo de mezcla de framework UI podría no ser compatible en futuras versiones del framework .NET.
Al final, sin embargo, la decisión depende de usted: ¿realmente necesita el control WinForms o hay una alternativa WPF que podría funcionar igual de bien?