[.Net] Intégrer et utiliser un contrôle utilisateur Windows (2.0) avec une application WPF(3.0).
Comme toute personne vous n’aimez pas refaire quelque chose qui marche bien. L’idée ici est de réaliser un contrôle utilisateur avec le Framework 2.0, comme si on le faisait sous Visual Studio 2005, et de l’utiliser dans un projet WPF.
1) On crée un contrôle utilisateur simple avec le Framework 2.0:
Celui-ci se compose de 2 labels, une Textbox et un bouton.
Si je saisis quelque chose dans la Textbox, quand je clique sur le bouton, le texte de label2 devient « Hello + le contenu de ma Textbox».
Il est important de pouvoir capter l’évènement clic du bouton à l’extérieur du contrôle, pour ce faire il est d’usage de fournir un évènement public qui est levé lors de l’appel de la méthode button1_click. Le code est le suivant :
public partial class UserControlSimple : UserControl
{
public event EventHandler monevenement;
public UserControlSimple()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
label2.Text="Hello " + textBox1.Text;
monevenement(this, null);
}
}
L’évènement «monevenement » sera accessible depuis l’extérieur de la dll qui sera générée et permettra de savoir quand on a cliqué sur le bouton. Ceci n’est pas spécifique à l’utilisation d’un contrôle windows dans WPF mais c’est un bon procédé de développement de manière générale.
2)On crée un projet « Application WPF » qui va héberger notre contrôle .
Première chose à faire quand on sait qu’on va intégrer des contrôles windows, c’est d’ajouter les références aux espaces de nom WindowsBase et WindowsFormsIntegration.
Ensuite on ajoute la référence à la dll qui a été généré lors de la compilation de notre bibliothèque de contrôle utilisateur .
Dans notre fenètre, dans la partie XAML on va spécifier la référence à notre WindowsFormsControlLibrary1.dll dans la balise Windows et on va, par la même, créer un alias pour pouvoir utiliser ce controle ( « moncontrole ») dans le reste du code.
Tout contrôle qui vient du Framework 2.0 doit être hébergé par un contenenur spécifique qui est le contrôle WindowsFormsHost.Donc on fait glisser ce contrôle de la boite à outil vers l’interface ou, si on préfère, on ajoute une balise WindowsFormsHost au code XAML entre les balises <Grid> et </Grid>.
Au sein de la balise WindowsFormsHost on ajoute une balise « ma référence à la dll :mon contrôle » et comme on a un évènement public dans le contrôle on y a accès ici (l’intellisense XAML propose le nom de notre évènement).Qui dit évènement, dit gestionnaire d’évènement, donc une fois qu’on a « monevenement= « » », un petit coup de tab tab et le gestionnaire d’évènement est crée et lié à notre clic sur le bouton.
Sous le windowsFormsHost on pose une textbox WPF qui recevra le contenu de la WindowsFormsTextbox quand on aura cliqué sur le bouton.
<Window x:Class="WpfApplicationControleWindows.Window1"
…
xmlns:moncontrole="clr-namespace:WindowsFormsControlLibrary1 ;assembly=WindowsFormsControlLibrary1">
<Grid>
<WindowsFormsHost>
<moncontrole:UserControlSimple monevenement="test_monevenement”/>
</WindowsFormsHost>
<TextBox x:Name="matextbox" Text="coucou"/>
</Grid>
</Window>
Voici l’interface Graphique :
Au niveau du code behind maintenant, on va faire référence à l’espace de nom WindowsFormsControlLibrary1, ce qui nous permettra d’avoir accès aux classes de cette dll.
On se place dans ce gestionnaire d’évènement et on crée une instance de la classe UserControlSimple(qu’on va appeler « LeControle »).
On parcour les contrôles que contient « LeControle », à la recherche la WindowsTextbox à l’aide d’un Foreach .
Quand on sera placé sur la textbox, on concatène son contenu avec celui de la textbox WPF:
private void UserControlSimple_monevenement(object sender, EventArgs e)
{ UserControlSimple LeControle = new UserControlSimple();
LeControle = sender as UserControlSimple;
foreach (System.Windows.Forms.Control texte in LeControle.Controls)
{Type montype = texte.GetType();
if (montype == typeof(System.Windows.Forms.TextBox))
{matextbox.Text = matextbox.Text + " " + texte.Text;}
}
}
Le résultat :