Tutorial: Hospedar un control de formularios Windows Forms de otro proveedor en una aplicación de WPF
En este tutorial se muestra cómo utilizar WPF Designer for Visual Studio para hospedar un control de formularios Windows Forms de otro fabricante en una aplicación 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 WPF, se enlaza un elemento TextBlock a la propiedad Date.
En este tutorial realizará las siguientes tareas:
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 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, en función de los valores de configuración o de edición activos. Para cambiar la configuración, elija la opción Importar y exportar configuraciones del menú Herramientas. Para obtener más información, vea Trabajar con valores de configuración.
Requisitos previos
Necesita los componentes siguientes para completar este tutorial:
- Visual Studio 2010.
Crear el proyecto de WPF
El primer paso es crear el proyecto de WPF para la aplicación host.
Para crear el proyecto
Cree un nuevo proyecto de aplicación 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.
MainWindow.xaml se abre en WPF Designer.
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
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
En el Explorador de soluciones, haga clic con el botón secundario en el archivo UserControl1 y seleccione Cambiar nombre.
Cambie el nombre del control a VendorControl. Cuando se le pregunte si desea cambiar el nombre de todas las referencias, haga clic en Sí.
En la superficie de diseño, seleccione VendorControl.
En la ventana Propiedades, establezca el valor de la propiedad Size en 200,200.
En el Cuadro de herramientas, haga doble clic en el control MonthCalendar.
Se muestra un control MonthCalendar en la superficie de diseño.
En la ventana Propiedades, establezca las siguientes propiedades del control MonthCalendar:
Propiedad
Valor
Margin
0,0,0,0
ShowToday
False
Establezca el tamaño de VendorControl de forma que coincida con el tamaño del control MonthCalendar.
Seleccione el control MonthCalendar.
En la ventana Propiedades, haga clic en la pestaña Eventos y, a continuación, haga doble clic en el evento DateChanged.
El archivo VendorControl se abre en el Editor de código y se agrega un controlador de eventos para el evento DateChanged.
Reemplace el código existente con 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 } }
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 WPF.
Para hospedar el control de formularios Windows Forms en WPF
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.
Abra MainWindow.xaml en WPF Designer.
En el Cuadro de herramientas, arrastre un control WindowsFormsHost a la superficie de diseño.
Se ha agregado en el proyecto HostingMonthCalendar una referencia al ensamblado WindowsFormsIntegration.dll.
En la vista XAML, reemplace el marcado existente con el marcado siguiente. Este código XAML asigna el espacio de nombres VendorControlLibrary y enlaza un elemento TextBlock a la propiedad Date de VendorControl.
<Window x:Class="HostingMonthCalendar.MainWindow" 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>
En el menú Depurar, elija Iniciar depuración.
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 Windows Forms. Para obtener más información, vea Utilizar controles WPF.
Vea también
Tareas
Tutorial: Hospedar un control de Windows Forms en WPF
Referencia
Otros recursos
Trabajar con controles en WPF Designer
Historial de cambios
Fecha |
Historial |
Motivo |
---|---|---|
Septiembre de 2010 |
Se ha agregado un paso que faltaba. |
Comentarios de los clientes. |