Compartilhar via


Demonstra Passo a passo: Hospedagem de um controle de formulários do Windows de terceiros em um aplicativo do WPF

Essa explicação passo a passo mostra como usar o Windows Presentation Foundation (WPF) Designer for Visual Studio para hospedar um controle de terceiros fornecedor Formulários do Windows em um aplicativo WPF.Para obter mais informações sobre interoperabilidade Formulários do Windows e WPF, consulte Migração e Interoperabilidade.

Essa explicação passo a passo, você usará um controle MonthCalendar para representar um fornecedor de terceiros de controle.Você criar um UserControl Tipo que possui uma instância do controle MonthCalendar na sua coleção Controls.O tipo UserControl expõe uma propriedade Date e implementa lógica personalizada para definir o comportamento do controle MonthCalendar.No aplicativo WPF, um elemento TextBlock está ligado à propriedade Date.

Nesta explicação passo a passo, você executa as seguintes tarefas:

  • Crie o projeto WPF.

  • Crie um controle de usuário Formulários do Windows para encapsular o controle do fornecedor.

  • Hospedar o controle de usuário Formulários do Windows em um aplicativo WPF.

A ilustração a seguir mostra como o aplicativo será exibido.

Observação:

As caixas de diálogo e comandos de menu demonstradas podem ser diferentes daqueles descritas na Ajuda, dependendo das configurações ativas ou configurações de edição.Para alterar as configurações, escolher Importar e exportar configurações on the Ferramentas menu.Para obter mais informações, consulte Configurações do Visual Studio.

Pré-requisitos

Para completar este passo a passo, são necessários os seguintes componentes:

  • Visual Studio 2008.

Criando o projeto

A primeira etapa é criar um projeto para o aplicativo host.

Para criar o projeto

  1. Criar um novo projeto de aplicativo WPF em Visual Basic ou Visual C# chamado HostingMonthCalendar .Para obter mais informações, consulte Como: Criar um novo projeto de aplicativo do WPF.

    Window1.xaml é aberto no WPF Designer.

  2. No Solution Explorer, adicione uma referência ao conjunto de módulos (assembly) WindowsFormsIntegration, que é chamado WindowsFormsIntegration.dll.

Criando o controle composto Formulários do Windows

Este procedimento mostra como criar um controle composto um tipo derivar da classe UserControl.

Criando o controle composto Formulários do Windows

  1. Adicione um novo projeto Biblioteca de controle Formulários do Windows em Visual Basic ou Visual C# chamado VendorControlLibrary a solução.Para obter mais informações, consulte Como: Adicionar e remover itens de solução.

    Abre UserControl1 na Windows Forms Designer

  2. Em Gerenciador de Soluções ,clique com o botão direito do mouse no arquivo UserControl1, e selecione Renomear .

  3. Altere o nome do controle para VendorControl .Quando você for solicitado se você deseja renomear todas as referências, clique em Sim .

  4. Abra o formulário no Windows Forms Designer.

  5. Selecione o elemento no modo de exibição Design.

  6. No Propriedades janela, defina o valor do Size propriedade para 200,200.

  7. Da Caixa de Ferramentas ,clique duas vezes no MonthCalendar controle.

    Um MonthCalendar controle aparece na superfície de design.

  8. Na janela Properties,defina as seguintes propriedades para o controle MonthCalendar.

    Propriedade

    Valor

    Margin

    0,0,0,0

    ShowToday

    False:

  9. No Windows Forms Designer, defina o tamanho de VendorControl para coincidir com o tamanho do MonthCalendar controle.

  10. Abra o arquivo VendorControl no Editor de Códigos.

  11. Substitua o código existente com o seguinte código.Esse código define uma propriedade Date e alguma lógica para restringir propriedades, MonthCalendar do SelectionStart Controle de data intervalo e SelectionEnd, com o mesmo valor como TodayDate.Esse código também implementa a interface INotifyPropertyChanged, que é usada no WPF associação de dados.

    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. No menu Build,selecione Build Solution para criar a solução.

Que hospedam o controle Formulários do Windows no WPF

Você usar o elemento WindowsFormsHost Host VendorControl em um aplicativo WPF.

Que hospedam o controle Formulários do Windows no WPF

  1. No projeto de HostingMonthCalendar Gerenciador de Soluções ,adicione uma referência ao projeto VendorControlLibrary.Para obter mais informações, consulte Como: Adicionar ou remover referências no Visual Studio (Visual Basic).

  2. Abra Window1.xaml no WPF Designer.

  3. No modo de exibição XAML, substitua o XAML gerado automaticamente pelo seguinte XAML.Este XAML mapeia o VendorControlLibrary namespace, cria um elemento WindowsFormsHost e vincula um elemento TextBlock para a propriedade Date no 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>
    

    Uma região que representa o controle hospedado Formulários do Windows aparece no designer.Se o controle não for exibido, clique na guia Design para alternar para modo de design.

  4. No menu Debug, selecione Start Without Debugging.

  5. Clique no controle MonthCalendar para alterar a data atual.O WPF TextBlock Elemento atualizações para exibir a data selecionada.

Próximas etapas

  • Se o controle será amplamente usado em um ambiente WPF, você pode derivar de WindowsFormsHost sua própria classe e expor a propriedade Date.Isso permite que outros controles WPF ligar diretamente a propriedade Date,sem usar a sintaxe Path=Child.Date.

  • Você também pode host WPF controles em Formulários do Windows.Para obter mais informações, consulte Usando Controles Windows Presentation Foundation.

Consulte também

Tarefas

Demonstra Passo a passo: Hospedagem de um Controlarar Windows Forms no Windows Presentation Foundation

Referência

WindowsFormsHost

ElementHost

Outros recursos

Trabalhar com controles no criador de WPF

Migração e Interoperabilidade