Controles WPF en WinForms - Blog de Oskar Alvarez

Controles WPF en WinForms

En el anterior Post vimos como utilizar controles WinForms en WPF, ahora vamos a ver como utilizar controles WPF en aplicaciones Winforms, de esta manera podemos enriquecer nuestras antiguas aplicaciones WinForms e incluso poder realizar una migración paso a paso.

Al igual que en WPF en WinForms debemos de añadir una referencia a un assembly, en este caso a WindowsFormIntegration

image

Para añadir el control de WPF elegiremos Add New item en nuestro proyecto, eligiendo un control de WPF

 

image

El XAML de nuestro control será

 

  1. <UserControl x:Class="WindowsFormsWPFInterop.UserControl1"
  2.    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.    Height="300" Width="300">    <Grid>        <ComboBox>            <ComboBoxItem Margin="2">                <Ellipse Width="20" Height="20" Stroke="Black" />            </ComboBoxItem>            <ComboBoxItem Margin="2">                <Path Stroke="Black" Data="M 0,0 L 20,0 L 10,20 Z" />            </ComboBoxItem>            <ComboBoxItem Margin="2">                <Rectangle Stroke="Black" Width="20" Height="20" />            </ComboBoxItem>        </ComboBox>    </Grid>UserControl>
  5. </

 

 

 

Ahora en nuestro WinForm debemos de añadir el control ElementHost que se encuentra dentro de la categoría WPF Interoperability

 

image

Una vez introducido en el Form debemos de indicarle que control de WPF queremos hostear

 

image

Ahora si ejecutamos la aplicación obtenemos un combo muy fácil den WPF que sería bastante mas complicado de realizar en WinForm

image

Fácilx de realizar no?

Published 9/9/2009 11:50 por Oskar Alvarez
Archivado en:
Comparte este post:
http://geeks.ms/blogs/oalvarez/archive/2009/09/09/controles-wpf-en-winforms.aspx

Comentarios

# Controles WPF en WinForms

En el anterior Post vimos como utilizar controles WinForms en WPF, ahora vamos a ver como utilizar controles

Wednesday, September 09, 2009 12:42 PM por .NET con oskar

# re: Controles WPF en WinForms

Sería interesante una explicación de como convertir Forms a WPF o al menos como poder diseñar una capa que permita conectar la capa de negocio a una de WPF o Forms indistintamente

Wednesday, September 09, 2009 5:43 PM por Julio Trujillo Leon

# re: Controles WPF en WinForms

@Julio

A que te refieres exactamente? La capa de lógica de negocio debe ser independiente de Winforms/WPF que no dejan de ser tecnologías de presentación.

Para poder reutilizar una capa de negocio en aplicaciones Winforms/WPF, la comunicación puede ser acoplada en dirección presentación -> negocio, pero debe ser desacoplada en sentido inverso (p.ej. a través de eventos).

Lo que sí debe contemplarse es cuanta lógica hacen tus formularios. Si tus formularios winforms / wpf tienen lógica de negocio incorporada entonces tienes un problema, ya que has "atado" tu lógica a tu presentación. En este caso se impone una refactorización a un patrón tipo MVP, que te permitirá separar la presentación pura de la lógica que antes tenias acoplada. Dependiendo del nivel de acople que tengas entre tus vistas y tus presenters será más o menos fácil intercambiar la capa de presentación. Si tus vistas se limitan a procesar eventos genéricos y a comunicarse con presenters (preferiblemente a través de una interfaz) y NO exponen públicamente ningún control cambiar la tecnología de presentación es relativamente sencillo :)

Un saludo!

PD: @oskar... un blog muy interesante el tuyo!

Thursday, September 10, 2009 2:36 PM por Eduard Tomàs i Avellana

# re: Controles WPF en WinForms

No tengo nada mas que añadir al comentario de Eduard, lo ha resumido perfectamehte

Friday, September 11, 2009 7:29 AM por Oskar Alvarez

# re: Controles WPF en WinForms

Hola Eduard y Oskar, sería fenomenal un ejemplillo de una solucion con un ensamblado de capa de negocio que pudiera ser consumido pe. con aplicaciones WinForms y WPF.

Lo digo pq dicho así "Si tus vistas se limitan a procesar eventos genéricos y a comunicarse con presenters (preferiblemente a través de una interfaz..." es demasiado genérico.

Incluso, si queréis olvidaros de Winforms y esponer "la buena práctica" de como hacer por un lado los componenestes de reglas de negocio y como conectarlos a la capa de presentación.

Un saludo

Friday, September 11, 2009 10:16 AM por Julio Trujillo Leon

# Como independizar tu capa de lógica de tu capa de presentación…

A raiz del siguiente post del excelente blog de Oskar , Julio Trujillo comentó en un comentario

Thursday, September 17, 2009 6:37 PM por Burbujas en .NET

# re: Controles WPF en WinForms

Muy bueno  el ejemplo amigo,solo que tengo una duda, en el windows form, como puedo manipular los eventos del combo, para saber que cambio la seleccion por ejemplo. Seleciono el elementhost, y en las propiedades no tengo ningun evento del combo...

Thursday, February 04, 2010 6:04 PM por Fernando

# re: Controles WPF en WinForms

Fernando si le das un nombre al combo con la propiedad x:Name, el codigo podria ser el siguiente

public Form1()

   {

     InitializeComponent();

     ElementHost elhost = new ElementHost();

     elhost.Size = new Size(110, 60);

     elhost.Location = new Point(45,35);

     MyWPFControl wpfctl = new MyWPFControl();

     elhost.Child = wpfctl;

     wpfctl.cmbTest.SelectedIndex = 0;

     this.Controls.Add(elhost);

   }

Como ves podemos acceder a la propiedad SelectedIndex del combo

Thursday, February 04, 2010 10:14 PM por Oskar Alvarez

# re: Controles WPF en WinForms

Estimado oskar Gracias por tu repuesta, pero lo que yo quiero es acceder a un metodo, por ejemplo tengo un wpf usercontrol en el cual tengo 2 botones, agrego este control de usuario a un windows form, desde la barra de herramientas, pero en el windows form como hago para poder hacer que se hagan algunas acciones cuando se da click en alguno de los botones, Probe algo como esto.

public event EventHandler<EventArgs> boton1Click;

       private void btnBloque1_Click(object sender, RoutedEventArgs e)

       {

           if (boton1Click != null)

               boton1Click(this, EventArgs.Empty);

       }

Pero en el windows form, cuando doy clic y reviso en los metodos del element host, no me aparece el metodo boton1Click.

espero me puedas ayudar

Thursday, February 04, 2010 11:19 PM por Fernando