none
Comment gérer les UserControls dans une form ? RRS feed

  • Question

  • Bonjour tout le monde !

    Je suis face a un petit soucis avec les Usercontrols et je n'arrive pas à trouver la réponse à ma question.

    J'ai un Usercontrol qui est actif dans ma form et je veux qu'en cliquant sur un bouton présent dans ma form, l'Usercontrol dans lequel je me trouve disparaisse et qu'un autre prend sa place.

    J'ai un menu dans ma form qui me permet de passer d'un Usercontrol à un autre sans problème mais dés que je dois fermer un Usercontrol dans lequel je me trouve pour en ouvrir un autre impossible. Je n'arrive même pas à fermer l'usercontrol dans lequel je me trouve...

    Donc soit je gère mal mes UserControls, soit j'ai loupé quelque chose.

    J'avais pensé à utiliser les évènements pour gérer cela mais je ne vois pas trop comment procéder.

    Actuellement la solution que l'on m'a proposé et qui fonctionne est de mettre mon bouton directement dans ma form comme ça je gère le Usercontrol de la même façon que pour le menu mais je pense qu'il doit exister une solution plus "propre" que celle-ci.

    Donc je suis preneur de toute solution à ce problème ^^.

    Merci d'avance !

    jeudi 29 mars 2012 09:35

Réponses

  • Avoir le this.Parent permet de faire ensuite un Children.Remove(this) dessus afin que le contrôle utilisateur s'enlève lui-même de son container... Après cela me fait penser à un onglet qui n'aurait qu'un seul onglet visible sans titre ou au contrôle MultiView (qui existe je crois en ASP.NET, pas en WPF). Pour exposer un évènement depuis un contrôle utilisateur voir par exemple http://www.c-sharpcorner.com/uploadfile/mahesh/user-control-in-wpf/ et le FileNameChanged


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    • Marqué comme réponse Sebastien.F vendredi 30 mars 2012 09:58
    jeudi 29 mars 2012 18:34
  • J'ai trouvé une solution à mon problème en utilisant les évènements.

    Je créé un évènement dans le user que je dois fermer, j'utilise cet évènement pour fournir à ma form des paramètres qui me seront utiles dans le user suivant, j'abonne ma form à cet user et je n'ai plus qu'à remove et add les users concernés en fonction des paramètres reçus.

    Je ne sais pas si c'est le plus propre mais c'est déjà mieux que de mettre tout un tas d'éléments en masqués dans ma form pour réaliser ceci.

    En tout cas merci pour ces réponses !

    vendredi 30 mars 2012 09:58

Toutes les réponses

  • Bonjour,

    Je crois comprendre que cela marche quand vous appelez votre code depuis un bouton externe à votre UserControl mais que cela ne marche pas quand c'est depuis un menu (alors que le UserControl a le focus). Dans le premier cas cliquez sur le bouton lui donne le focus. Donc je soupçonne un problème lié au focus.

    Quand c'est fait depuis le menu , avez vous essayé de donner le focus à un autre contrôle avant de le retirer ? Il n'y a pas de message d'erreur ?

    Sinon je crois que le mieux serait de présenter le projet le plus simple possible qui permet de reproduire ce problème pour être sûr de la situation exacte.

    Finalement j'ai fait un essai vite fait sans voir de souci : un StackPanel avec un TextBlock A, un UserControl, un StackPanel B. Dans le click du bouton présent dans le userControl je fais un Remove du UserControl et il disparait bien de l'écran... Essayez peut-être de changer sa visibilité ou sa couleur pour voir si vous adressez bien le bon contrôle ?


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".


    jeudi 29 mars 2012 11:40
  • En fait, je n'ai pas de soucis avec le menu ni avec un bouton s'ils sont présents dans ma form. Par contre je n'arrive pas à fermer un usercontrol et en ouvrir un autre.

    Pour schématiser :

    J'ai une Form : form1

    Dans form1 j'ai un Grid : grid

    Deux UserControl : uc1 et uc2

    Dans uc1 j'ai un bouton : btn_validate

    -> Au chargement de form1 j'ajoute à mon grid, uc1.

    -> Quand je clique sur btn_validate il doit se passer ça :

               1/ uc1 se ferme

               2/ uc2 prend sa place en étant chargé dans grid

    Sinon voila un bout de code si ça peut aider :

    //Le code de ma forme :
    
    using System.Windows;
    
    namespace WPF_UserControl
    {
    
        public partial class MainWindow : Window
        {
    
            private UserControl1 uc1;
            private UserControl2 uc2;
    
            public MainWindow()
            {
                InitializeComponent();
    
                uc1 = new UserControl1();
                uc2 = new UserControl2();
            }
    
            private void Window_Loaded(object sender, RoutedEventArgs e)
            {
                this.grid.Children.Add(uc1);
            }
        }
    }


    //Code du usercontrole 1 qui contient mon bouton
    
    using System.Windows.Controls;
    using System.Windows;
    
    namespace WPF_UserControl
    {
    
        public partial class UserControl1 : UserControl
        {
            public UserControl1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, RoutedEventArgs e)
            {
                /*
                 * Ici je veux que CET UserControl se ferme
                 * Et que uc2 se lance
                 * 
                 */ 
            }
        }
    }

    Sinon la solution que l'on m'a fournis c'est de retirer mes boutons validés de mes UserControls pour les mettre directement dans ma form et les masquer ou les afficher en fonction du usercontrol actif.

    En fait, je pense que mon problème c'est être capable de retourner dans ma form à partir de mon UserControl.

    jeudi 29 mars 2012 12:24
  • Avez-vous essayé this.Parent pour accéder au contrôle parent ? Je croyais aussi qu'il était possible d'accéder directement à la fenêtre mais à l'instant je ne trouve pas (ou je confonds peut-être avec Windows Forms ?)

    Sur le plan du principe je pense qu'il serait peut-être plus souple d'exposer un évènement click et que ce soit le formulaire qui fasse la substitution (sinon le problème suivant que je vois est que uc1 doit connaitre l'instance uc2 que vous avez initialisé dans le formulaire).

    Ou si les deux contrôles fonctionnent toujours de concert on pourrait imaginer que ce soit un seul "user control" et que l'on se contente d'en masquer ou montrer une partie en fonction des besoins mais là il faudrait comprendre le rôle de ces contrôles l'un par rapport à l'autre.

    Idem si on bascule toujours entre les deux mêmes contrôles on pourrait imaginer de jouer uniquement sur la visibilité...


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    jeudi 29 mars 2012 13:27
  • Pour moi this.parent me permettrait juste de définir le control qui m'a appelé, et dans mon cas c'est toujours le même, et non de retourner sur la form mère. Au mieux, ça peut me permettre de créer une nouvelle instance de mon control mère, chose que je veux éviter.

    Ensuite, l'autre soucis c'est que j'ai tout une collection de contrôle dont le "sens" d'activation varie en fonction de plusieurs critère. Je peux donc avoir le cheminement :

    uc1 -> uc2 -> uc3 -> uc4

    ou :

    uc1 -> uc3 -> uc2 -> uc4

    J'avais pensé à placer un évènement dans mon évènement click de mes users mais je ne sais pas si cela est possible et je ne vois pas trop comment l'on peut mettre cela en place car je ne suis pas très au courant du système des évènements. Car si cela est possible, il ne resterait plus qu'à abonner ma form mère à cet évènement.

    jeudi 29 mars 2012 13:49
  • Avoir le this.Parent permet de faire ensuite un Children.Remove(this) dessus afin que le contrôle utilisateur s'enlève lui-même de son container... Après cela me fait penser à un onglet qui n'aurait qu'un seul onglet visible sans titre ou au contrôle MultiView (qui existe je crois en ASP.NET, pas en WPF). Pour exposer un évènement depuis un contrôle utilisateur voir par exemple http://www.c-sharpcorner.com/uploadfile/mahesh/user-control-in-wpf/ et le FileNameChanged


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    • Marqué comme réponse Sebastien.F vendredi 30 mars 2012 09:58
    jeudi 29 mars 2012 18:34
  • J'ai trouvé une solution à mon problème en utilisant les évènements.

    Je créé un évènement dans le user que je dois fermer, j'utilise cet évènement pour fournir à ma form des paramètres qui me seront utiles dans le user suivant, j'abonne ma form à cet user et je n'ai plus qu'à remove et add les users concernés en fonction des paramètres reçus.

    Je ne sais pas si c'est le plus propre mais c'est déjà mieux que de mettre tout un tas d'éléments en masqués dans ma form pour réaliser ceci.

    En tout cas merci pour ces réponses !

    vendredi 30 mars 2012 09:58