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.
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
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.
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
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.
Dans l'explorateur de solutions, cliquez avec le bouton droit sur le fichier UserControl1 et sélectionnez Renommer.
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.
Ouvrez VendorControl dans le Concepteur Windows Forms.
Sur l'aire de conception, sélectionnez VendorControl.
Dans la fenêtre Propriétés, affectez à la propriété Size la valeur 200,200.
Depuis la Boîte à outils, double-cliquez sur le contrôle MonthCalendar.
Un contrôle MonthCalendar apparaît sur l'aire de conception.
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:
Dans le Concepteur Windows Forms, réglez la taille de VendorControl de manière à ce qu'elle corresponde à la taille du contrôle MonthCalendar.
Ouvrez le fichier VendorControl dans l'éditeur de code.
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 } }
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
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).
Ouvrez Window1.xaml dans le Concepteur WPF.
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.
Dans le menu Déboguer, cliquez sur Démarrer le débogage.
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