Compartir a través de


Tutorial: Hospedar un control de formularios Windows Forms de otro proveedor en una aplicación de WPF

Actualización: noviembre 2007

En este tutorial se muestra cómo utilizar Windows Presentation Foundation (WPF) Designer for Visual Studio para hospedar un control de formularios Windows Forms de otro fabricante en una aplicación de WPF. Para obtener más información acerca de la interoperabilidad de los formularios Windows Forms y WPF, vea Migración e interoperabilidad.

En este tutorial se utiliza un control MonthCalendar para representar un control de otro fabricante. Se crea un tipo UserControl que tiene una instancia del control MonthCalendar en su colección Controls. El tipo UserControl expone una propiedad Date e implementa la lógica personalizada para definir el comportamiento del control MonthCalendar. En la aplicación de WPF, se enlaza un elemento TextBlock a la propiedad Date.

Realizará las tareas siguientes:

  • Crear el proyecto de WPF.

  • Crear un control de usuario de formularios Windows Forms para encapsular el control de otro fabricante.

  • Hospedar el control de usuario de formularios Windows Forms en una aplicación de WPF.

En la ilustración siguiente se muestra la apariencia que tendrá la aplicación.

Nota:

Los cuadros de diálogo y comandos de menú que se ven pueden diferir de los descritos en la Ayuda, dependiendo de los valores de configuración o de edición activos. Para cambiar la configuración, elija Importar y exportar configuraciones en el menú Herramientas. Para obtener más información, vea Valores de configuración de Visual Studio.

Requisitos previos

Necesita los componentes siguientes para completar este tutorial:

  • Visual Studio 2008.

Crear el proyecto de WPF

El primer paso es crear el proyecto de WPF para la aplicación host.

Para crear el proyecto

  1. Cree un nuevo proyecto de aplicación de WPF en Visual Basic o en Visual C# denominado HostingMonthCalendar. Para obtener más información, vea Cómo: Crear un nuevo proyecto de aplicación de WPF.

    Window1.xaml se abrirá en el WPF Designer.

  2. En el Explorador de soluciones, agregue una referencia al ensamblado WindowsFormsIntegration, denominado WindowsFormsIntegration.dll.

Crear el control compuesto de formularios Windows Forms

Este procedimiento muestra cómo crear un control compuesto derivando un tipo de la clase UserControl.

Para crear el control compuesto de formularios Windows Forms

  1. Agregue un nuevo proyecto de biblioteca de controles de formularios Windows Forms en Visual Basic o Visual C# denominado VendorControlLibrary a la solución. Para obtener más información, vea Cómo: Agregar y quitar elementos de una solución.

    Se abre UserControl1 en el Diseñador de Windows Forms

  2. En el Explorador de soluciones, haga clic con el botón secundario en el archivo UserControl1 y seleccione Cambiar nombre.

  3. Cambie el nombre del control a VendorControl. Cuando se le pregunte si desea cambiar el nombre de todas las referencias, haga clic en Sí.

  4. Abra VendorControl en el Diseñador de Windows Forms.

  5. En la superficie de diseño, seleccione VendorControl.

  6. En la ventana Propiedades, establezca el valor de la propiedad Size en 200,200.

  7. En el Cuadro de herramientas, haga doble clic en el control MonthCalendar.

    Se muestra un control MonthCalendar en la superficie de diseño.

  8. En la ventana Propiedades, establezca las siguientes propiedades para el control MonthCalendar:

    Propiedad

    Valor

    Margin

    0,0,0,0

    ShowToday

    False:

  9. En el Diseñador de Windows Forms, establezca el tamaño de VendorControl de modo que coincida con el tamaño del control MonthCalendar.

  10. Abra el archivo VendorControl en el Editor de código.

  11. Reemplace el código existente por el siguiente código. Este código define una propiedad Date y parte de la lógica para restringir las propiedades de intervalo de fechas del control MonthCalendar, que son SelectionStart y SelectionEnd, al mismo valor que TodayDate. Este código también implementa la interfaz INotifyPropertyChanged, que se utiliza en el enlace de datos de WPF.

    Imports System
    Imports System.Collections.Generic
    Imports System.ComponentModel
    Imports System.Drawing
    Imports System.Data
    Imports System.Linq
    Imports System.Text
    Imports System.Windows.Forms
    
    Public Class VendorControl
        Inherits UserControl
        Implements INotifyPropertyChanged
    
        <Browsable(True)> _
        Public Property [Date]() As String
            Get
                Return Me.MonthCalendar1.TodayDate.ToShortDateString()
            End Get
    
            Set(ByVal value As String)
                If value <> Me.MonthCalendar1.TodayDate.ToShortDateString() Then
                    Dim newDate As DateTime = DateTime.Parse(value)
                    Me.SetDate(newDate)
                    Me.NotifyPropertyChanged("Date")
                End If
            End Set
        End Property
    
    
        Private Sub monthCalendar1_DateChanged( _
            ByVal sender As Object, ByVal e As DateRangeEventArgs) _
        Handles MonthCalendar1.DateChanged
            Me.SetDate(e.Start)
            Me.NotifyPropertyChanged("Date")
    
        End Sub
    
    
        Private Sub SetDate(ByVal [date] As DateTime)
            Me.MonthCalendar1.TodayDate = [date]
            Me.MonthCalendar1.SelectionStart = [date]
            Me.MonthCalendar1.SelectionEnd = [date]
    
        End Sub
    
    #Region "INotifyPropertyChanged Implementation"
    
        Public Event PropertyChanged As PropertyChangedEventHandler _
            Implements INotifyPropertyChanged.PropertyChanged
    
        Private Sub NotifyPropertyChanged(ByVal info As String)
            RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(info))
        End Sub
    
    #End Region
    End Class
    
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.Data;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace VendorControlLibrary
    {
        public partial class VendorControl : UserControl, INotifyPropertyChanged
        {
            public VendorControl()
            {
                InitializeComponent();
            }
    
            [Browsable(true)]
            public string Date
            {
                get
                {
                    return this.monthCalendar1.TodayDate.ToShortDateString();
                }
    
                set
                {
                    if (value != this.monthCalendar1.TodayDate.ToShortDateString())
                    {
                        DateTime newDate = DateTime.Parse(value);
                        this.SetDate(newDate);
                        this.OnPropertyChanged("Date");
                    }
                }
            }
    
            private void monthCalendar1_DateChanged(object sender, DateRangeEventArgs e)
            {
                this.SetDate(e.Start);
                this.OnPropertyChanged("Date");
            }
    
            private void SetDate(DateTime date)
            {
                this.monthCalendar1.TodayDate = date;
                this.monthCalendar1.SelectionStart = date;
                this.monthCalendar1.SelectionEnd = date;
            }
    
            #region INotifyPropertyChanged Implementation
    
            public event PropertyChangedEventHandler PropertyChanged;
    
            private void OnPropertyChanged(string propertyName)
            {
                if (this.PropertyChanged != null)
                {
                    this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
    
            #endregion
        }
    }
    
  12. En el menú Generar, seleccione Generar solución para generar la solución.

Hospedar el control de formularios Windows Forms en WPF

Se utiliza el elemento WindowsFormsHost para hospedar VendorControl en una aplicación de WPF.

Para hospedar el control de formularios Windows Forms en WPF

  1. En el proyecto HostingMonthCalendar del Explorador de soluciones, agregue una referencia al proyecto VendorControlLibrary. Para obtener más información, vea Cómo: Agregar o quitar referencias en Visual Studio (Visual Basic).

  2. Abra Window1.xaml en WPF Designer.

  3. En la vista XAML, reemplace el marcado existente con el marcado siguiente. Este XAML asigna el espacio de nombres VendorControlLibrary, crea un elemento WindowsFormsHost y enlaza un elemento TextBlock a la propiedad Date de VendorControl.

    <Window x:Class="HostingMonthCalendar.Window1"
        xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:v="clr-namespace:VendorControlLibrary;assembly=VendorControlLibrary"
        Title="Window1" Height="300" Width="300">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition />
            </Grid.RowDefinitions>
    
            <WindowsFormsHost Name="Host" Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center">
                <v:VendorControl Date="2/2/03" />
            </WindowsFormsHost>
    
            <TextBlock Grid.Row="1" 
                       Text="{Binding ElementName=Host, Path=Child.Date, Mode=OneWay, UpdateSourceTrigger=PropertyChanged }" 
                       HorizontalAlignment="Stretch" 
                       VerticalAlignment="Center" 
                       TextAlignment="Center" 
                       TextDecorations="None" 
                       FontSize="24" />
        </Grid>
    </Window>
    
    <Window x:Class="HostingMonthCalendar.Window1"
        xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:v="clr-namespace:VendorControlLibrary;assembly=VendorControlLibrary"
        Title="Window1" Height="300" Width="300">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition />
            </Grid.RowDefinitions>
    
            <WindowsFormsHost Name="Host" Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center">
                <v:VendorControl Date="2/2/03" />
            </WindowsFormsHost>
    
            <TextBlock Grid.Row="1" 
                       Text="{Binding ElementName=Host, Path=Child.Date, Mode=OneWay, UpdateSourceTrigger=PropertyChanged }" 
                       HorizontalAlignment="Stretch" 
                       VerticalAlignment="Center" 
                       TextAlignment="Center" 
                       TextDecorations="None" 
                       FontSize="24" />
        </Grid>
    </Window>
    

    Aparece en el diseñador un área que representa el control de formularios Windows Forms hospedado. Si el control no aparece, haga clic en la ficha Diseño para cambiar a la vista Diseño.

  4. En el menú Depurar, elija Iniciar depuración.

  5. Haga clic en el control MonthCalendar para cambiar la fecha actual. El elemento TextBlock de WPF se actualiza para mostrar la fecha seleccionada.

Pasos siguientes

  • Si el control se va a utilizar de manera generalizada en un entorno de WPF, puede derivar su propia clase de WindowsFormsHost y exponer la propiedad Date. Esto permite que otros controles de WPF se enlacen directamente a la propiedad Date, sin utilizar la sintaxis Path=Child.Date.

  • También puede hospedar controles de WPF en formularios Windows Forms. Para obtener más información, vea Usar controles de Windows Presentation Foundation.

Vea también

Tareas

Tutorial: Hospedar un control de formularios Windows Forms en Windows Presentation Foundation

Referencia

WindowsFormsHost

ElementHost

Otros recursos

Trabajar con controles en WPF Designer

Migración e interoperabilidad