Blog de Laurent Valente

Responsable technique Microsoft , Akka technologies

Laurent Valente

moi

Consulatnt technique, Expert Microsoft chez AKKA Technologie.

J'accompagne les équipes sur les différents projets Microsoft.

Ma carte de visite Microsoft

Mon CV

Mon transcript

[.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:

clip_image001

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 :

 

clip_image002

 

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 :

clip_image003

 

Posted: Oct 24 2008, 18:27 by laurentv | Comments (1) RSS comment feed |
  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Filed under: .NET | Privé

Comments

christophen said:

Du coup si je comprend bien WPF comme GTK# introduit une notion de conteneur (ici grid)?
j'avai toujours pas remarqué...
on peut donc centrer des contrôle et autres sans indiquer les coordonnées et sans dommage au resize de la fenêtre ou en cas de texte traduits de longueur différente en wpf?

// une petite recherche plus tard

Effectivement WPF propose de frai avancées et à su prendre cet atout de GTK#... néanmoins le nombre de conteneurs de base est plus restreint...

# October 24 2008, 19:34

Add comment




biuquote
  • Comment
  • Preview
Loading

captcha

*