Partager via


Procédure pas à pas : hébergement d'un contrôle Windows Forms tiers dans une application WPF

Mise à jour : novembre 2007

Cette procédure pas à pas vous indique comment utiliser le Concepteur Windows Presentation Foundation (WPF) pour Visual Studio pour héberger un contrôle Windows Forms d'un fournisseur tiers dans une application WPF. Pour plus d'informations sur l'interopérabilité Windows Forms et WPF, consultez Migration et interopérabilité.

Dans cette procédure pas à pas, vous allez utiliser un contrôle MonthCalendar pour représenter un contrôle de fournisseur tiers. Vous créez un type UserControl qui possède une instance du contrôle MonthCalendar dans sa collection Controls. Le type UserControl expose une propriété Date et implémente une logique personnalisée pour définir le comportement du contrôle MonthCalendar. Dans l'application WPF, un élément TextBlock est lié à la propriété Date.

Dans cette procédure pas à pas, vous exécutez les tâches suivantes :

  • créer le projet WPF ;

  • créer un contrôle utilisateur Windows Forms pour encapsuler le contrôle du fournisseur tiers ;

  • héberger le contrôle utilisateur Windows Forms dans une application WPF.

L'illustration suivante donne un aperçu de votre application.

Contrôle Windows Forms hébergé

Remarque :

Les boîtes de dialogue et les commandes de menu qui s'affichent peuvent être différentes de celles qui sont décrites dans l'aide, en fonction de vos paramètres actifs ou de l'édition utilisée. Pour modifier vos paramètres, choisissez Importation et exportation de paramètres dans le menu Outils. Pour plus d'informations, consultez Paramètres Visual Studio.

Composants requis

Vous avez besoin des composants suivants pour exécuter cette procédure pas à pas :

  • Visual Studio 2008.

Création du projet WPF

La première étape consiste à créer le projet WPF comme application hôte.

Pour créer le projet

  1. Créez un projet Application WPF dans Visual Basic ou Visual C# nommé HostingMonthCalendar. Pour plus d'informations, consultez Comment : créer un projet d'application WPF.

    Window1.xaml s'ouvre dans Concepteur WPF.

  2. Dans l'explorateur de solutions, ajoutez une référence à l'assembly WindowsFormsIntegration nommé WindowsFormsIntegration.dll.

Création du contrôle composite Windows Forms

Cette procédure indique comment créer un contrôle composite en dérivant un type de la classe UserControl.

Pour créer le contrôle composite Windows Forms

  1. Ajoutez à la solution un nouveau projet bibliothèque de contrôles Windows Forms dans Visual Basic ou Visual C#, nommé VendorControlLibrary. Pour plus d'informations, consultez Comment : ajouter et supprimer des éléments de solution.

    UserControl1 s'ouvre dans le Concepteur Windows Forms.

  2. Dans l'explorateur de solutions, cliquez avec le bouton droit sur le fichier UserControl1 et sélectionnez Renommer.

  3. Modifiez le nom du contrôle en VendorControl. Lors de la question de savoir si vous souhaitez renommer toutes les références, cliquez Oui.

  4. Ouvrez VendorControl dans le Concepteur Windows Forms.

  5. Sur l'aire de conception, sélectionnez VendorControl.

  6. Dans la fenêtre Propriétés, affectez à la propriété Size la valeur 200,200.

  7. Depuis la Boîte à outils, double-cliquez sur le contrôle MonthCalendar.

    Un contrôle MonthCalendar apparaît sur l'aire de conception.

  8. Dans la fenêtre Propriétés, définissez les propriétés suivantes pour le contrôle MonthCalendar.

    Propriété

    Valeur

    Margin

    0,0,0,0

    ShowToday

    False:

  9. Dans le Concepteur Windows Forms, réglez la taille de VendorControl de manière à ce qu'elle corresponde à la taille du contrôle MonthCalendar.

  10. Ouvrez le fichier VendorControl dans l'éditeur de code.

  11. Remplacez le code existant par celui-ci. Ce code définit une propriété Date et une logique permettant de restreindre les propriétés de la plage de dates du contrôle MonthCalendar, de SelectionStart et de SelectionEnd à la même valeur que TodayDate. Ce code implémente également l'interface INotifyPropertyChanged, utilisée dans la liaison de données 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. Dans le menu Générer, sélectionner Générer la solution pour générer la solution.

Hébergement du contrôle Windows Forms dans WPF

Vous utilisez l'élément WindowsFormsHost pour héberger VendorControl dans une application WPF.

Pour héberger le contrôle Windows Forms dans WPF

  1. Dans le projet HostingMonthCalendar de l'Explorateur de solutions, ajoutez une référence au projet VendorControlLibrary. Pour plus d'informations, consultez Comment : ajouter ou supprimer des références dans Visual Studio (Visual Basic).

  2. Ouvrez Window1.xaml dans le Concepteur WPF.

  3. En mode XAML, remplacez le balisage existant par le suivant. Ce XAML mappe l'espace de noms VendorControlLibrary, crée un élément WindowsFormsHost et lie un élément TextBlock à la propriété Date sur 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>
    

    Une zone représentant le contrôle Windows Forms hébergé apparaît dans le concepteur. Si le contrôle n'apparaît pas, cliquez sur l'onglet Design pour basculer en mode Design.

  4. Dans le menu Déboguer, cliquez sur Démarrer le débogage.

  5. Cliquez sur le contrôle MonthCalendar pour modifier la date courante. L'élément WPF TextBlock se met à jour pour afficher la date sélectionnée.

Étapes suivantes

  • Si votre contrôle est largement utilisé dans un environnement WPF, vous pouvez dériver votre propre classe de WindowsFormsHost et exposer la propriété Date. Cela permet à d'autres contrôles WPF de créer directement une liaison avec la propriété Date, sans utiliser la syntaxe Path=Child.Date.

  • Vous pouvez également héberger des contrôles WPF dans les Windows Forms. Pour plus d'informations, consultez Utilisation des contrôles Windows Presentation Foundation.

Voir aussi

Tâches

Procédure pas à pas : hébergement d'un contrôle Windows Forms dans Windows Presentation Foundation

Référence

WindowsFormsHost

ElementHost

Autres ressources

Utilisation de contrôles dans le concepteur WPF

Migration et interopérabilité