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?

9 comentarios sobre “Controles WPF en WinForms”

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

  2. @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!

  3. 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

  4. 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…

  5. 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

  6. 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 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

Responder a etomas Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *