Tutorial: Hospedar un control compuesto de formularios Windows Forms en WPFWalkthrough: Hosting a Windows Forms Composite Control in WPF

Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) proporciona un entorno rico para crear aplicaciones.provides a rich environment for creating applications. Sin embargo, cuando tiene una inversión sustancial Windows FormsWindows Forms código, puede ser más efectivo reutilizar al menos parte de ese código en su WPFWPF aplicación en lugar de a escribirlo desde cero.However, when you have a substantial investment in Windows FormsWindows Forms code, it can be more effective to reuse at least some of that code in your WPFWPF application rather than to rewrite it from scratch. El escenario más común es cuando tiene controles de Windows Forms existentes.The most common scenario is when you have existing Windows Forms controls. En algunos casos, incluso podría no tener acceso al código fuente de estos controles.In some cases, you might not even have access to the source code for these controls. WPFWPF Proporciona un procedimiento sencillo para hospedar estos controles en un WPFWPF aplicación.provides a straightforward procedure for hosting such controls in a WPFWPF application. Por ejemplo, puede usar WPFWPF para la mayoría de la programación mientras hospeda sus especializada DataGridView controles.For example, you can use WPFWPF for most of your programming while hosting your specialized DataGridView controls.

Este tutorial le guía a través de una aplicación que hospeda un control compuesto de formularios de Windows para realizar la entrada de datos en un WPFWPF aplicación.This walkthrough steps you through an application that hosts a Windows Forms composite control to perform data entry in a WPFWPF application. El control compuesto se empaqueta en un archivo DLL.The composite control is packaged in a DLL. Este procedimiento general se puede extender a aplicaciones y controles más complejos.This general procedure can be extended to more complex applications and controls. En este tutorial está diseñado para ser casi idéntico en aspecto y funcionalidad al Tutorial: Hospedar un Control compuesto de WPF en Windows Forms.This walkthrough is designed to be nearly identical in appearance and functionality to Walkthrough: Hosting a WPF Composite Control in Windows Forms. La principal diferencia es que se invierte el escenario de hospedaje.The primary difference is that the hosting scenario is reversed.

Este tutorial está dividido en dos secciones.The walkthrough is divided into two sections. La primera sección describe brevemente la implementación del control compuesto de formularios de Windows.The first section briefly describes the implementation of the Windows Forms composite control. La segunda sección explica en detalle cómo hospedar un control compuesto en una WPFWPF recibir eventos desde el control de aplicación y obtener acceso a algunas de las propiedades del control.The second section discusses in detail how to host the composite control in a WPFWPF application, receive events from the control, and access some of the control's properties.

Las tareas ilustradas en este tutorial incluyen:Tasks illustrated in this walkthrough include:

  • Implementar el control compuesto de formularios Windows Forms.Implementing the Windows Forms composite control.

  • Implementar la aplicación host de WPF.Implementing the WPF host application.

Para obtener una lista de código completo de las tareas ilustradas en este tutorial, vea hospedar un Control compuesto de Windows Forms en WPF Sample.For a complete code listing of the tasks illustrated in this walkthrough, see Hosting a Windows Forms Composite Control in WPF Sample.

Requisitos previosPrerequisites

Necesita Visual Studio para completar este tutorial.You need Visual Studio to complete this walkthrough.

Implementar el control compuesto de formularios Windows FormsImplementing the Windows Forms Composite Control

El control de Windows Forms compuesto utilizado en este ejemplo es un formulario de entrada de datos simple.The Windows Forms composite control used in this example is a simple data-entry form. Este formulario toma el nombre y la dirección del usuario y, después, usa un evento personalizado para devolver esa información al host.This form takes the user's name and address and then uses a custom event to return that information to the host. En la ilustración siguiente se muestra la representación del control.The following illustration shows the rendered control.

La siguiente imagen muestra un control compuesto de formularios de Windows:The following image shows a Windows Forms composite control:

Captura de pantalla que muestra un control Windows Forms simple.

Crear el proyectoCreating the Project

Para iniciar el proyecto:To start the project:

  1. Iniciar Microsoft Visual StudioMicrosoft Visual Studioy abra el nuevo proyecto cuadro de diálogo.Launch Microsoft Visual StudioMicrosoft Visual Studio, and open the New Project dialog box.

  2. En la categoría de ventana, seleccione el biblioteca de controles de Windows Forms plantilla.In the Window category, select the Windows Forms Control Library template.

  3. Asigne al nuevo proyecto el nombre de MyControls.Name the new project MyControls.

  4. Para la ubicación, especifique una carpeta con el nombre de nivel superior, como WpfHostingWindowsFormsControl.For the location, specify a conveniently named top-level folder, such as WpfHostingWindowsFormsControl. Más tarde, colocará la aplicación host en esta carpeta.Later, you will put the host application in this folder.

  5. Haga clic en Aceptar para crear el proyecto.Click OK to create the project. El proyecto predeterminado contiene un solo control denominado UserControl1.The default project contains a single control named UserControl1.

  6. En el Explorador de soluciones, cambie el nombre UserControl1 a MyControl1.In Solution Explorer, rename UserControl1 to MyControl1.

El proyecto debe tener referencias a los siguientes archivos DLL del sistema.Your project should have references to the following system DLLs. Si alguno de estos archivos DLL no está incluido de forma predeterminada, agréguelo al proyecto.If any of these DLLs are not included by default, add them to the project.

  • SistemaSystem

  • System.DataSystem.Data

  • System.DrawingSystem.Drawing

  • System.Windows.FormsSystem.Windows.Forms

  • System.XmlSystem.Xml

Agregar controles al formularioAdding Controls to the Form

Para agregar controles al formulario:To add controls to the form:

  • Abra MyControl1 en el diseñador.Open MyControl1 in the designer.

Agregue cinco Label controles y sus correspondientes TextBox controles, tamaños y la organización tal como están en la ilustración anterior, en el formulario.Add five Label controls and their corresponding TextBox controls, sized and arranged as they are in the preceding illustration, on the form. En el ejemplo, el TextBox se denominan controles:In the example, the TextBox controls are named:

  • txtName

  • txtAddress

  • txtCity

  • txtState

  • txtZip

Agregue dos Button controles etiquetados Aceptar y cancelar.Add two Button controls labeled OK and Cancel. En el ejemplo, los nombres de los botones son btnOK y btnCancel, respectivamente.In the example, the button names are btnOK and btnCancel, respectively.

Implementar el código auxiliarImplementing the Supporting Code

Abra el formulario en la vista Código.Open the form in code view. El control devuelve los datos recopilados al host generando personalizado OnButtonClick eventos.The control returns the collected data to its host by raising the custom OnButtonClick event. Los datos están contenidos en el objeto de argumento de evento.The data is contained in the event argument object. En el código siguiente se muestra la declaración de evento y delegado.The following code shows the event and delegate declaration.

Agregue el código siguiente a la clase MyControl1 .Add the following code to the MyControl1 class.

public delegate void MyControlEventHandler(object sender, MyControlEventArgs args);
public event MyControlEventHandler OnButtonClick;
Public Delegate Sub MyControlEventHandler(ByVal sender As Object, ByVal args As MyControlEventArgs)
Public Event OnButtonClick As MyControlEventHandler

La MyControlEventArgs clase contiene la información que se devuelve al host.The MyControlEventArgs class contains the information to be returned to the host.

Agregue la clase siguiente al formulario.Add the following class to the form.

public class MyControlEventArgs : EventArgs
{
    private string _Name;
    private string _StreetAddress;
    private string _City;
    private string _State;
    private string _Zip;
    private bool _IsOK;

    public MyControlEventArgs(bool result,
                                   string name,
                                   string address,
                                   string city,
                                   string state,
                                   string zip)
    {
        _IsOK = result;
        _Name = name;
        _StreetAddress = address;
        _City = city;
        _State = state;
        _Zip = zip;
    }

    public string MyName
    {
        get { return _Name; }
        set { _Name = value; }
    }
    public string MyStreetAddress
    {
        get { return _StreetAddress; }
        set { _StreetAddress = value; }
    }
    public string MyCity
    {
        get { return _City; }
        set { _City = value; }
    }
    public string MyState
    {
        get { return _State; }
        set { _State = value; }
    }
    public string MyZip
    {
        get { return _Zip; }
        set { _Zip = value; }
    }
    public bool IsOK
    {
        get { return _IsOK; }
        set { _IsOK = value; }
    }
}
Public Class MyControlEventArgs
    Inherits EventArgs
    Private _Name As String
    Private _StreetAddress As String
    Private _City As String
    Private _State As String
    Private _Zip As String
    Private _IsOK As Boolean
    
    
    Public Sub New(ByVal result As Boolean, ByVal name As String, ByVal address As String, ByVal city As String, ByVal state As String, ByVal zip As String) 
        _IsOK = result
        _Name = name
        _StreetAddress = address
        _City = city
        _State = state
        _Zip = zip
    
    End Sub
    
    
    Public Property MyName() As String 
        Get
            Return _Name
        End Get
        Set
            _Name = value
        End Set
    End Property
    
    Public Property MyStreetAddress() As String 
        Get
            Return _StreetAddress
        End Get
        Set
            _StreetAddress = value
        End Set
    End Property
    
    Public Property MyCity() As String 
        Get
            Return _City
        End Get
        Set
            _City = value
        End Set
    End Property
    
    Public Property MyState() As String 
        Get
            Return _State
        End Get
        Set
            _State = value
        End Set
    End Property
    
    Public Property MyZip() As String 
        Get
            Return _Zip
        End Get
        Set
            _Zip = value
        End Set
    End Property
    
    Public Property IsOK() As Boolean 
        Get
            Return _IsOK
        End Get
        Set
            _IsOK = value
        End Set
    End Property
End Class

Cuando el usuario hace clic en el Aceptar o cancelar botón, el Click creación controladores de eventos un MyControlEventArgs objeto que contiene los datos y genera el OnButtonClick eventos.When the user clicks the OK or Cancel button, the Click event handlers create a MyControlEventArgs object that contains the data and raises the OnButtonClick event. La única diferencia entre los dos controladores es el argumento de evento IsOK propiedad.The only difference between the two handlers is the event argument's IsOK property. Esta propiedad permite que el host determine en qué botón se ha hecho clic.This property enables the host to determine which button was clicked. Se establece en true para el Aceptar botón, y false para el cancelar botón.It is set to true for the OK button, and false for the Cancel button. En el código siguiente se muestran los dos controladores de botón.The following code shows the two button handlers.

Agregue el código siguiente a la clase MyControl1 .Add the following code to the MyControl1 class.

private void btnOK_Click(object sender, System.EventArgs e)
{

    MyControlEventArgs retvals = new MyControlEventArgs(true,
                                                         txtName.Text,
                                                         txtAddress.Text,
                                                         txtCity.Text,
                                                         txtState.Text,
                                                         txtZip.Text);
    OnButtonClick(this, retvals);
}

private void btnCancel_Click(object sender, System.EventArgs e)
{
    MyControlEventArgs retvals = new MyControlEventArgs(false,
                                                         txtName.Text,
                                                         txtAddress.Text,
                                                         txtCity.Text,
                                                         txtState.Text,
                                                         txtZip.Text);
    OnButtonClick(this, retvals);
}
Private Sub btnOK_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnOK.Click

    Dim retvals As New MyControlEventArgs(True, txtName.Text, txtAddress.Text, txtCity.Text, txtState.Text, txtZip.Text)
    RaiseEvent OnButtonClick(Me, retvals)

End Sub

Private Sub btnCancel_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnCancel.Click
    Dim retvals As New MyControlEventArgs(False, txtName.Text, txtAddress.Text, txtCity.Text, txtState.Text, txtZip.Text)
    RaiseEvent OnButtonClick(Me, retvals)

End Sub

Dar un nombre seguro al ensamblado y compilar el ensambladoGiving the Assembly a Strong Name and Building the Assembly

Para este ensamblado hacer referencia a un WPFWPF aplicación, debe tener un nombre seguro.For this assembly to be referenced by a WPFWPF application, it must have a strong name. Para crear un nombre seguro, cree un archivo de clave con Sn.exe y agréguelo al proyecto.To create a strong name, create a key file with Sn.exe and add it to your project.

  1. Abra un símbolo del sistema de Programa para la mejoraVisual Studio.Open a Programa para la mejoraVisual Studio command prompt. Para ello, haga clic en el iniciar menú y, a continuación, seleccione todos los programas/Microsoft/Visual Studio 2010 símbolo Visual Studio Tools y Visual Studio.To do so, click the Start menu, and then select All Programs/Microsoft Visual Studio 2010/Visual Studio Tools/Visual Studio Command Prompt. Esto inicia una ventana de consola con variables de entorno personalizadas.This launches a console window with customized environment variables.

  2. En el símbolo del sistema, use el cd comando para ir a la carpeta del proyecto.At the command prompt, use the cd command to go to your project folder.

  3. Ejecute el comando siguiente para generar un archivo de clave denominado MyControls.snk.Generate a key file named MyControls.snk by running the following command.

    Sn.exe -k MyControls.snk
    
  4. Para incluir el archivo de clave en el proyecto, haga clic en el nombre del proyecto en el Explorador de soluciones y, a continuación, haga clic en propiedades.To include the key file in your project, right-click the project name in Solution Explorer and then click Properties. En el Diseñador de proyectos, haga clic en el firma ficha, seleccione el firmar el ensamblado casilla de verificación y, a continuación, vaya al archivo de clave.In the Project Designer, click the Signing tab, select the Sign the assembly check box and then browse to your key file.

  5. Compile la solución.Build the solution. La compilación generará un archivo DLL denominado MyControls.dll.The build will produce a DLL named MyControls.dll.

Implementar la aplicación host de WPFImplementing the WPF Host Application

El WPFWPF hospedar la aplicación usa el WindowsFormsHost control para hospedar MyControl1.The WPFWPF host application uses the WindowsFormsHost control to host MyControl1. La aplicación controla el OnButtonClick eventos para recibir los datos del control.The application handles the OnButtonClick event to receive the data from the control. También tiene una colección de botones de opción que le permiten cambiar algunas de las propiedades del control desde el WPFWPF aplicación.It also has a collection of option buttons that enable you to change some of the control's properties from the WPFWPF application. En la ilustración siguiente se muestra la aplicación finalizada.The following illustration shows the finished application.

La siguiente imagen muestra la aplicación completa, incluido el control incrustado en la aplicación de WPF:The following image shows the complete application, including the control embedded in the WPF application:

Captura de pantalla que muestra un control incrustado en una página WPF.

Crear el proyectoCreating the Project

Para iniciar el proyecto:To start the project:

  1. Abra Programa para la mejoraVisual Studioy seleccione nuevo proyecto.Open Programa para la mejoraVisual Studio, and select New Project.

  2. En la categoría de ventana, seleccione el aplicación WPF plantilla.In the Window category, select the WPF Application template.

  3. Asigne al nuevo proyecto el nombre de WpfHost.Name the new project WpfHost.

  4. Para la ubicación, especifique la misma carpeta de nivel superior que contiene el proyecto MyControls.For the location, specify the same top-level folder that contains the MyControls project.

  5. Haga clic en Aceptar para crear el proyecto.Click OK to create the project.

También deberá agregar referencias a la DLL que contiene MyControl1 y a otros ensamblados.You also need to add references to the DLL that contains MyControl1 and other assemblies.

  1. Haga clic en el nombre del proyecto en el Explorador de soluciones y seleccione Agregar referencia.Right-click the project name in Solution Explorer and select Add Reference.

  2. Haga clic en el examinar pestaña y vaya a la carpeta que contiene MyControls.dll.Click the Browse tab, and browse to the folder that contains MyControls.dll. En este tutorial, esta carpeta es MyControls\bin\Debug.For this walkthrough, this folder is MyControls\bin\Debug.

  3. Seleccione MyControls.dll y, a continuación, haga clic en Aceptar.Select MyControls.dll, and then click OK.

  4. Agregue una referencia al ensamblado WindowsFormsIntegration, denominado WindowsFormsIntegration.dll.Add a reference to the WindowsFormsIntegration assembly, which is named WindowsFormsIntegration.dll.

Implementar el diseño básicoImplementing the Basic Layout

El interfaz de usuario (UI)user interface (UI) del host de aplicación se implementa en MainWindow.xaml.The interfaz de usuario (UI)user interface (UI) of the host application is implemented in MainWindow.xaml. Este archivo contiene Lenguaje XAML (Extensible Application Markup Language)Extensible Application Markup Language (XAML) marcado que define el diseño y hospeda el control de Windows Forms.This file contains Lenguaje XAML (Extensible Application Markup Language)Extensible Application Markup Language (XAML) markup that defines the layout, and hosts the Windows Forms control. La aplicación se divide en tres regiones:The application is divided into three regions:

  • El las propiedades del Control panel, que contiene una colección de botones de opción que puede usar para modificar varias propiedades del control hospedado.The Control Properties panel, which contains a collection of option buttons that you can use to modify various properties of the hosted control.

  • El datos desde el Control panel, que contiene varias TextBlock devuelven elementos que muestran los datos procedentes del control hospedado.The Data from Control panel, which contains several TextBlock elements that display the data returned from the hosted control.

  • El control hospedado.The hosted control itself.

En el siguiente código XAML se muestra el diseño básico.The basic layout is shown in the following XAML. El marcado que se necesita para hospedar MyControl1 se omite en este ejemplo, pero se tratará más adelante.The markup that is needed to host MyControl1 is omitted from this example, but will be discussed later.

Reemplace el código XAML del archivo MainWindow.xaml.vb por el código siguiente.Replace the XAML in MainWindow.xaml with the following. Si utiliza Visual Basic, cambie la clase a x:Class="MainWindow".If you are using Visual Basic, change the class to x:Class="MainWindow".

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      x:Class="WpfHost.MainWindow"
      xmlns:mcl="clr-namespace:MyControls;assembly=MyControls"
      Loaded="Init">
  <DockPanel>
    <DockPanel.Resources>
      <Style x:Key="inlineText" TargetType="{x:Type Inline}">
        <Setter Property="FontWeight" Value="Normal"/>
      </Style>
      <Style x:Key="titleText" TargetType="{x:Type TextBlock}">
        <Setter Property="DockPanel.Dock" Value="Top"/>
        <Setter Property="FontWeight" Value="Bold"/>
        <Setter Property="Margin" Value="10,5,10,0"/>
      </Style>
    </DockPanel.Resources>

    <StackPanel Orientation="Vertical"
                DockPanel.Dock="Left"
                Background="Bisque"
                Width="250">

      <TextBlock  Margin="10,10,10,10"
                  FontWeight="Bold"
                  FontSize="12">Control Properties</TextBlock>
      <TextBlock Style="{StaticResource titleText}">Background Color</TextBlock>
      <StackPanel Margin="10,10,10,10">
        <RadioButton Name="rdbtnOriginalBackColor"
                    IsChecked="True"
                    Click="BackColorChanged">Original</RadioButton>
        <RadioButton Name="rdbtnBackGreen"
                    Click="BackColorChanged">LightGreen</RadioButton>
        <RadioButton Name="rdbtnBackSalmon"
                    Click="BackColorChanged">LightSalmon</RadioButton>
      </StackPanel>

      <TextBlock Style="{StaticResource titleText}">Foreground Color</TextBlock>
      <StackPanel Margin="10,10,10,10">
        <RadioButton Name="rdbtnOriginalForeColor"
                    IsChecked="True"
                    Click="ForeColorChanged">Original</RadioButton>
        <RadioButton Name="rdbtnForeRed"
                    Click="ForeColorChanged">Red</RadioButton>
        <RadioButton Name="rdbtnForeYellow"
                    Click="ForeColorChanged">Yellow</RadioButton>
      </StackPanel>

      <TextBlock Style="{StaticResource titleText}">Font Family</TextBlock>
      <StackPanel Margin="10,10,10,10">
        <RadioButton Name="rdbtnOriginalFamily"
                     IsChecked="True"
                    Click="FontChanged">Original</RadioButton>
        <RadioButton Name="rdbtnTimes"
                    Click="FontChanged">Times New Roman</RadioButton>
        <RadioButton Name="rdbtnWingdings"
                    Click="FontChanged">Wingdings</RadioButton>
      </StackPanel>

      <TextBlock Style="{StaticResource titleText}">Font Size</TextBlock>
      <StackPanel Margin="10,10,10,10">
        <RadioButton Name="rdbtnOriginalSize"
                    IsChecked="True"
                    Click="FontSizeChanged">Original</RadioButton>
        <RadioButton Name="rdbtnTen"
                    Click="FontSizeChanged">10</RadioButton>
        <RadioButton Name="rdbtnTwelve"
                    Click="FontSizeChanged">12</RadioButton>
      </StackPanel>

      <TextBlock Style="{StaticResource titleText}">Font Style</TextBlock>
      <StackPanel Margin="10,10,10,10">
        <RadioButton Name="rdbtnNormalStyle"
                     IsChecked="True"
                     Click="StyleChanged">Original</RadioButton>
        <RadioButton Name="rdbtnItalic"
                     Click="StyleChanged">Italic</RadioButton>
      </StackPanel>

      <TextBlock Style="{StaticResource titleText}">Font Weight</TextBlock>
      <StackPanel Margin="10,10,10,10">
        <RadioButton Name="rdbtnOriginalWeight"
                     IsChecked="True"
                   Click="WeightChanged">
          Original
        </RadioButton>
        <RadioButton Name="rdbtnBold"
                   Click="WeightChanged">Bold</RadioButton>
      </StackPanel>
    </StackPanel>

    <WindowsFormsHost Name="wfh"
                     DockPanel.Dock="Top"
                     Height="300">
      <mcl:MyControl1 Name="mc"/>
    </WindowsFormsHost>
    
    <StackPanel Orientation="Vertical"
                Height="Auto"
                Background="LightBlue">
      <TextBlock Margin="10,10,10,10"
            FontWeight="Bold"
            FontSize="12">Data From Control</TextBlock>
      <TextBlock Style="{StaticResource titleText}">
        Name: <Span Name="txtName" Style="{StaticResource inlineText}"/>
      </TextBlock>
      <TextBlock Style="{StaticResource titleText}">
        Street Address: <Span Name="txtAddress" Style="{StaticResource inlineText}"/>
      </TextBlock>
      <TextBlock Style="{StaticResource titleText}">
        City: <Span Name="txtCity" Style="{StaticResource inlineText}"/>
      </TextBlock>
      <TextBlock Style="{StaticResource titleText}">
        State: <Span Name="txtState" Style="{StaticResource inlineText}"/>
      </TextBlock>
      <TextBlock Style="{StaticResource titleText}">
        Zip: <Span Name="txtZip" Style="{StaticResource inlineText}"/>
      </TextBlock>
    </StackPanel>
  </DockPanel>
</Window>

La primera StackPanel elemento contiene varios conjuntos de RadioButton controles que permiten modificar diversas propiedades predeterminadas del control hospedado.The first StackPanel element contains several sets of RadioButton controls that enable you to modify various default properties of the hosted control. Seguido por un WindowsFormsHost elemento, qué hosts MyControl1.That is followed by a WindowsFormsHost element, which hosts MyControl1. El último StackPanel elemento contiene varios TextBlock elementos que mostrarán los datos devueltos por el control hospedado.The final StackPanel element contains several TextBlock elements that display the data that is returned by the hosted control. El orden de los elementos y el Dock y Height valores de atributo incrustan el control hospedado en la ventana sin espacios ni distorsión.The ordering of the elements and the Dock and Height attribute settings embed the hosted control into the window with no gaps or distortion.

Hospedar el controlHosting the Control

La siguiente versión editada del XAML anterior se centra en los elementos que son necesarios para hospedar MyControl1.The following edited version of the previous XAML focuses on the elements that are needed to host MyControl1.

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      x:Class="WpfHost.MainWindow"
      xmlns:mcl="clr-namespace:MyControls;assembly=MyControls"
      Loaded="Init">
<WindowsFormsHost Name="wfh"
                 DockPanel.Dock="Top"
                 Height="300">
  <mcl:MyControl1 Name="mc"/>
</WindowsFormsHost>

El xmlns atributo de asignación de espacio de nombres crea una referencia a la MyControls espacio de nombres que contiene el control hospedado.The xmlns namespace mapping attribute creates a reference to the MyControls namespace that contains the hosted control. Esta asignación permite representar MyControl1 en XAMLXAML como <mcl:MyControl1>.This mapping enables you to represent MyControl1 in XAMLXAML as <mcl:MyControl1>.

Dos elementos del código XAML controlan el hospedaje:Two elements in the XAML handle the hosting:

  • WindowsFormsHost representa el WindowsFormsHost elemento que le permite hospedar un control Windows Forms en un WPFWPF aplicación.WindowsFormsHost represents the WindowsFormsHost element that enables you to host a Windows Forms control in a WPFWPF application.

  • mcl:MyControl1, que representa MyControl1, se agrega a la WindowsFormsHost colección secundaria del elemento.mcl:MyControl1, which represents MyControl1, is added to the WindowsFormsHost element's child collection. Como resultado, este control de Windows Forms se representa como parte de la WPFWPF ventana y usted puede comunicarse con el control de la aplicación.As a result, this Windows Forms control is rendered as part of the WPFWPF window, and you can communicate with the control from the application.

Implementar el archivo de código subyacenteImplementing the Code-Behind File

El archivo de código subyacente, MainWindow.xaml.vb o MainWindow.xaml.cs, contiene el código de procedimiento que implementa la funcionalidad de la IUUI descritos en la sección anterior.The code-behind file, MainWindow.xaml.vb or MainWindow.xaml.cs, contains the procedural code that implements the functionality of the IUUI discussed in the preceding section. Las tareas principales son:The primary tasks are:

  • Adjuntar un controlador de eventos MyControl1del OnButtonClick eventos.Attaching an event handler to MyControl1's OnButtonClick event.

  • Modificar diversas propiedades de MyControl1, según cómo se establecen la colección de botones de opción.Modifying various properties of MyControl1, based on how the collection of option buttons are set.

  • Mostrar los datos recopilados por el control.Displaying the data collected by the control.

Inicializar la aplicaciónInitializing the Application

El código de inicialización está contenido en un controlador de eventos para la ventana Loaded eventos y adjunta un controlador de eventos para el control OnButtonClick eventos.The initialization code is contained in an event handler for the window's Loaded event and attaches an event handler to the control's OnButtonClick event.

En MainWindow.xaml.vb o MainWindow.xaml.cs, agregue el código siguiente a la MainWindow clase.In MainWindow.xaml.vb or MainWindow.xaml.cs, add the following code to the MainWindow class.

private Application app;
private Window myWindow;
FontWeight initFontWeight;
Double initFontSize;
FontStyle initFontStyle;
SolidColorBrush initBackBrush;
SolidColorBrush initForeBrush;
FontFamily initFontFamily;
bool UIIsReady = false;

private void Init(object sender, EventArgs e)
{
    app = System.Windows.Application.Current;
    myWindow = (Window)app.MainWindow;
    myWindow.SizeToContent = SizeToContent.WidthAndHeight;
    wfh.TabIndex = 10;
    initFontSize = wfh.FontSize;
    initFontWeight = wfh.FontWeight;
    initFontFamily = wfh.FontFamily;
    initFontStyle = wfh.FontStyle;
    initBackBrush = (SolidColorBrush)wfh.Background;
    initForeBrush = (SolidColorBrush)wfh.Foreground;
    (wfh.Child as MyControl1).OnButtonClick += new MyControl1.MyControlEventHandler(Pane1_OnButtonClick);
    UIIsReady = true;
}
Private app As Application
Private myWindow As Window
Private initFontWeight As FontWeight
Private initFontSize As [Double]
Private initFontStyle As FontStyle
Private initBackBrush As SolidColorBrush
Private initForeBrush As SolidColorBrush
Private initFontFamily As FontFamily
Private UIIsReady As Boolean = False


Private Sub Init(ByVal sender As Object, ByVal e As RoutedEventArgs)
    app = System.Windows.Application.Current
    myWindow = CType(app.MainWindow, Window)
    myWindow.SizeToContent = SizeToContent.WidthAndHeight
    wfh.TabIndex = 10
    initFontSize = wfh.FontSize
    initFontWeight = wfh.FontWeight
    initFontFamily = wfh.FontFamily
    initFontStyle = wfh.FontStyle
    initBackBrush = CType(wfh.Background, SolidColorBrush)
    initForeBrush = CType(wfh.Foreground, SolidColorBrush)

    Dim mc As MyControl1 = wfh.Child

    AddHandler mc.OnButtonClick, AddressOf Pane1_OnButtonClick
    UIIsReady = True

End Sub

Dado que el XAMLXAML anterior agregaba MyControl1 a la WindowsFormsHost colección de elementos secundarios del elemento, puede convertir el WindowsFormsHost del elemento Child para obtener la referencia al MyControl1.Because the XAMLXAML discussed previously added MyControl1 to the WindowsFormsHost element's child element collection, you can cast the WindowsFormsHost element's Child to get the reference to MyControl1. A continuación, puede usar esa referencia para asociar un controlador de eventos OnButtonClick.You can then use that reference to attach an event handler to OnButtonClick.

Además de proporcionar una referencia al propio control, WindowsFormsHost expone varias propiedades del control, que se pueden manipular desde la aplicación.In addition to providing a reference to the control itself, WindowsFormsHost exposes a number of the control's properties, which you can manipulate from the application. El código de inicialización asigna estos valores a variables globales privadas para su uso posterior en la aplicación.The initialization code assigns those values to private global variables for later use in the application.

Por lo que puede acceder fácilmente a los tipos en el MyControls DLL, agregue la siguiente Imports o using instrucción a la parte superior del archivo.So that you can easily access the types in the MyControls DLL, add the following Imports or using statement to the top of the file.

Imports MyControls
using MyControls;

Controlar el evento OnButtonClickHandling the OnButtonClick Event

MyControl1 Provoca el OnButtonClick eventos cuando el usuario hace clic en cualquiera de los botones del control.MyControl1 raises the OnButtonClick event when the user clicks either of the control's buttons.

Agregue el código siguiente a la clase MainWindow .Add the following code to the MainWindow class.

//Handle button clicks on the Windows Form control
private void Pane1_OnButtonClick(object sender, MyControlEventArgs args)
{
    txtName.Inlines.Clear();
    txtAddress.Inlines.Clear();
    txtCity.Inlines.Clear();
    txtState.Inlines.Clear();
    txtZip.Inlines.Clear();

    if (args.IsOK)
    {
        txtName.Inlines.Add( " " + args.MyName );
        txtAddress.Inlines.Add( " " + args.MyStreetAddress );
        txtCity.Inlines.Add( " " + args.MyCity );
        txtState.Inlines.Add( " " + args.MyState );
        txtZip.Inlines.Add( " " + args.MyZip );
    }
}
'Handle button clicks on the Windows Form control
Private Sub Pane1_OnButtonClick(ByVal sender As Object, ByVal args As MyControlEventArgs)
    txtName.Inlines.Clear()
    txtAddress.Inlines.Clear()
    txtCity.Inlines.Clear()
    txtState.Inlines.Clear()
    txtZip.Inlines.Clear()

    If args.IsOK Then
        txtName.Inlines.Add(" " + args.MyName)
        txtAddress.Inlines.Add(" " + args.MyStreetAddress)
        txtCity.Inlines.Add(" " + args.MyCity)
        txtState.Inlines.Add(" " + args.MyState)
        txtZip.Inlines.Add(" " + args.MyZip)
    End If

End Sub

Los datos en los cuadros de texto se empaquetan en el MyControlEventArgs objeto.The data in the text boxes is packed into the MyControlEventArgs object. Si el usuario hace clic en el Aceptar botón, el controlador de eventos extrae los datos y lo muestra en el panel siguiente MyControl1.If the user clicks the OK button, the event handler extracts the data and displays it in the panel below MyControl1.

Modificar las propiedades del controlModifying the Control’s Properties

El WindowsFormsHost elemento expone varias propiedades predeterminadas del control hospedado.The WindowsFormsHost element exposes several of the hosted control's default properties. Como resultado, puede cambiar el aspecto del control para que se adapte mejor al estilo de la aplicación.As a result, you can change the appearance of the control to match the style of your application more closely. Los conjuntos de botones de opción del panel izquierdo permiten al usuario modificar varias propiedades de color y fuente.The sets of option buttons in the left panel enable the user to modify several color and font properties. Cada conjunto de botones tiene un controlador para el Click evento, que detecta las selecciones de botón de opción del usuario y cambia la propiedad correspondiente en el control.Each set of buttons has a handler for the Click event, which detects the user's option button selections and changes the corresponding property on the control.

Agregue el código siguiente a la clase MainWindow .Add the following code to the MainWindow class.

private void BackColorChanged(object sender, RoutedEventArgs e)
{
    if (sender == rdbtnBackGreen)
        wfh.Background = new SolidColorBrush(Colors.LightGreen);
    else if (sender == rdbtnBackSalmon)
        wfh.Background = new SolidColorBrush(Colors.LightSalmon);
    else if (UIIsReady == true)
        wfh.Background = initBackBrush;
}

private void ForeColorChanged(object sender, RoutedEventArgs e)
{
    if (sender == rdbtnForeRed)
        wfh.Foreground = new SolidColorBrush(Colors.Red);
    else if (sender == rdbtnForeYellow)
        wfh.Foreground = new SolidColorBrush(Colors.Yellow);
    else if (UIIsReady == true)
        wfh.Foreground = initForeBrush;
}

private void FontChanged(object sender, RoutedEventArgs e)
{
    if (sender == rdbtnTimes)
        wfh.FontFamily = new FontFamily("Times New Roman");
    else if (sender == rdbtnWingdings)
        wfh.FontFamily = new FontFamily("Wingdings");
    else if (UIIsReady == true)
        wfh.FontFamily = initFontFamily;
}
private void FontSizeChanged(object sender, RoutedEventArgs e)
{
    if (sender == rdbtnTen)
        wfh.FontSize = 10;
    else if (sender == rdbtnTwelve)
        wfh.FontSize = 12;
    else if (UIIsReady == true)
        wfh.FontSize = initFontSize;
}
private void StyleChanged(object sender, RoutedEventArgs e)
{
    if (sender == rdbtnItalic)
        wfh.FontStyle = FontStyles.Italic;
    else if (UIIsReady == true)
        wfh.FontStyle = initFontStyle;
}
private void WeightChanged(object sender, RoutedEventArgs e)
{
    if (sender == rdbtnBold)
        wfh.FontWeight = FontWeights.Bold;
    else if (UIIsReady == true)
        wfh.FontWeight = initFontWeight;
}
Private Sub BackColorChanged(ByVal sender As Object, ByVal e As RoutedEventArgs)

    If sender.Equals(rdbtnBackGreen) Then
        wfh.Background = New SolidColorBrush(Colors.LightGreen)
    ElseIf sender.Equals(rdbtnBackSalmon) Then
        wfh.Background = New SolidColorBrush(Colors.LightSalmon)
    ElseIf UIIsReady = True Then
        wfh.Background = initBackBrush
    End If

End Sub

Private Sub ForeColorChanged(ByVal sender As Object, ByVal e As RoutedEventArgs)
    If sender.Equals(rdbtnForeRed) Then
        wfh.Foreground = New SolidColorBrush(Colors.Red)
    ElseIf sender.Equals(rdbtnForeYellow) Then
        wfh.Foreground = New SolidColorBrush(Colors.Yellow)
    ElseIf UIIsReady = True Then
        wfh.Foreground = initForeBrush
    End If

End Sub

Private Sub FontChanged(ByVal sender As Object, ByVal e As RoutedEventArgs)
    If sender.Equals(rdbtnTimes) Then
        wfh.FontFamily = New FontFamily("Times New Roman")
    ElseIf sender.Equals(rdbtnWingdings) Then
        wfh.FontFamily = New FontFamily("Wingdings")
    ElseIf UIIsReady = True Then
        wfh.FontFamily = initFontFamily
    End If

End Sub

Private Sub FontSizeChanged(ByVal sender As Object, ByVal e As RoutedEventArgs)
    If sender.Equals(rdbtnTen) Then
        wfh.FontSize = 10
    ElseIf sender.Equals(rdbtnTwelve) Then
        wfh.FontSize = 12
    ElseIf UIIsReady = True Then
        wfh.FontSize = initFontSize
    End If

End Sub

Private Sub StyleChanged(ByVal sender As Object, ByVal e As RoutedEventArgs)
    If sender.Equals(rdbtnItalic) Then
        wfh.FontStyle = FontStyles.Italic
    ElseIf UIIsReady = True Then
        wfh.FontStyle = initFontStyle
    End If

End Sub

Private Sub WeightChanged(ByVal sender As Object, ByVal e As RoutedEventArgs)
    If sender.Equals(rdbtnBold) Then
        wfh.FontWeight = FontWeights.Bold
    ElseIf UIIsReady = True Then
        wfh.FontWeight = initFontWeight
    End If

End Sub

Compile y ejecute la aplicación.Build and run the application. Agregue texto en el control compuesto de formularios de Windows y, a continuación, haga clic en Aceptar.Add some text in the Windows Forms composite control and then click OK. El texto aparece en las etiquetas.The text appears in the labels. Haga clic en los diferentes botones de radio para ver el efecto en el control.Click the different radio buttons to see the effect on the control.

Vea tambiénSee also