IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

3 Forms imbriquées


Sujet :

Windows Presentation Foundation

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2017
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Août 2017
    Messages : 71
    Points : 25
    Points
    25
    Par défaut 3 Forms imbriquées
    Bonjour

    J'ai un petit soucis

    J'ai 3 forms :

    MainForm.xaml.cs
    ParamsAffichage.xaml.cs
    Selection.xaml.cs

    Depuis la MainForm.xaml.cs j'ai un bouton qui ouvre la fenêtre ParamsAffichage.xamls.cs : comme vous pouvez le voir j'ouvre ma 2ème form en ShowDialog et j'attends le retour true de la form ParamsAfficahge.xaml.cs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    private void btnParamsAffichage_Click(object sender, RoutedEventArgs e)
            {
                dtTimer.Stop();
     
                ParamsAffichage frmParamsAffichage = new ParamsAffichage();
                frmParamsAffichage.ShowDialog();
     
                if (frmParamsAffichage.DialogResult.HasValue && frmParamsAffichage.DialogResult.Value)
                {
                    thrGetList = new Thread(GetList);
                    thrGetList.Start();
     
                    if (iValueDefaultSelection != 0)
                        iTimer = iValueDefaultSelection;
                }
                else
                {
     
                }
     
                this.Effect = null;
     
                if (Var.bRefreshAuto)
                    dtTimer.Start();
            }
    Depuis la ParamsAffichage.xaml.cs j'ai un bouton qui ouvre la fenêtre Selection.xamls.cs : comme vous pouvez le voir j'ouvre ma 3ème form en ShowDialog et j'attends le retour true de la form Selection.xaml.cs.

    Sauf qu'à ce moment là, j'aimerais cacher la fenêtre ParamsAfficahge.xaml.cs pour pas que les 2 fenêtres soit superposées (pour un côté esthétique) : je fais donc un this.Hide(); et un this.Show(); de ParamsAffichage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    private void btnSelectLigne_Click(object sender, RoutedEventArgs e)
            {
                Selection frmSelection = new Selection(Var.lstSelectedLignesChoisi, "Sélection de ligne", "Ligne");
     
                int i = 0;
     
                foreach (var item in frmSelection.LstSelection)
                {
                    if (Var.lstSelectedLignesChoisi.Contains(item.strCode))
                    {
                        item.bChecked = true;
                    }
     
                    i++;
                }
     
                //this.WindowState = WindowState.Minimized;
                this.Hide();
                frmSelection.ShowDialog();
     
                if (frmSelection.DialogResult.HasValue && frmSelection.DialogResult.Value)
                {
                    strSelectionLignes = "";
     
                    for (int j = 0; j < Var.lstSelectedLignesChoisi.Count; j++)
                    {
                        strSelectionLignes += Var.lstSelectedLignesChoisi[j].ToString() + " ";
                    }
     
                    ClearFiltresAndObjects();
     
                    Var.lstSelectedIlotsChoisi.Clear();
                    strSelectionIlots = "";
     
                    Var.lstSelectedPostesTravailChoisi.Clear();
                    strSelectionPostesTravail = "";
     
                }
                else
                {
     
                }
     
                //this.WindowState = WindowState.Normal;
                this.Show();
            }
    Puis dans la Form Selection.xaml.cs je retourne true une fois terminé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private void btnValider_Click(object sender, RoutedEventArgs e)
            {
                //this.lstSelectedLignesChoisi = lstSelectedLignes;
                this.DialogResult = true;
                this.Close();
            }
    Le problème : quand je valide (3ème bout de code), la ParamsAffichage.xaml.cs reçoit la réponse dans frmSelection.DialogResult.HasValue && frmSelection.DialogResult.Value mais ensuite la MainForm.xaml.cs reçoit également une réponse, alors que je n'ai pas encore fermé la ParamsAffichage.xaml.cs

    Pourquoi ?

    Pour résoudre mon problème, j'ai fais un Minimize de la 2ème form en attendant (en commentaire dans l'exemple)

    Cependant j'aimerais comprendre pourquoi j'ai ce problème et savoir comment la cacher

    Par avance merci et meilleures salutations.

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2017
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Août 2017
    Messages : 71
    Points : 25
    Points
    25
    Par défaut
    Bonjour

    J'ai fait une solution d'exemple rapide pour exprimer le problème en démo si quelqu'un veut se pencher sur le problème

    Téléchargeable ici : https://we.tl/ubvBx4IAgW

    On voit que lorsque l'on clique valider sur la 3ème fenêtre, on a 2 messagebox de résult, alors qu'il devrait y en avoir qu'un seul.

    Si on ne fait pas le hide / show de la seconde fenêtre pas de problème.

    Merci.

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 025
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 025
    Points : 5 462
    Points
    5 462
    Par défaut
    Citation Envoyé par Fellerson Voir le message
    Bonjour

    J'ai fait une solution d'exemple rapide pour exprimer le problème en démo si quelqu'un veut se pencher sur le problème

    Téléchargeable ici : https://we.tl/ubvBx4IAgW

    On voit que lorsque l'on clique valider sur la 3ème fenêtre, on a 2 messagebox de résult, alors qu'il devrait y en avoir qu'un seul.

    Si on ne fait pas le hide / show de la seconde fenêtre pas de problème.

    Merci.
    Si j'ai le temps ce soir je test ton projet.
    Mais là à vue de nez je dirais que c'est presque normal.
    Enfin plutôt tu fais un usage illogique d'une fenêtre modale. En gros la fenêtre modale est utilisée dans le cas ou tu souhaites afficher une fenêtre ayant un fort impact sur la fenêtre appelante jusqu'à en bloquer l'accès. Mais en cachant la fenêtre parente tu perds cette notion "d'importance" puisqu'on ne sait même plus qu'elle existe. D'un point de vue technique il me semble pas déconnant qu'aucun test n'est était fait dans ce sens et donc tu tombes surement sur un "bug", ou plutôt une limitation d'usage.
    Bref, au lieux de faire un Hide() et un Show() essaye de jouer directement sur les visibility (Visibility.Hidden et Visibility.Visible), ce qui évitera d'appeler des fonctions internes qui provoque ce phénomène.

    Sinon peut etre que tu devrais utiliser la navigationWindow qui va te permettre de rester sur la même page tout en changeant son contenu, un peu comme navigateur ou une application mobile.
    https://msdn.microsoft.com/fr-fr/lib...vs.110%29.aspx

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2017
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Août 2017
    Messages : 71
    Points : 25
    Points
    25
    Par défaut
    Citation Envoyé par micka132 Voir le message
    Si j'ai le temps ce soir je test ton projet.
    Mais là à vue de nez je dirais que c'est presque normal.
    Enfin plutôt tu fais un usage illogique d'une fenêtre modale. En gros la fenêtre modale est utilisée dans le cas ou tu souhaites afficher une fenêtre ayant un fort impact sur la fenêtre appelante jusqu'à en bloquer l'accès. Mais en cachant la fenêtre parente tu perds cette notion "d'importance" puisqu'on ne sait même plus qu'elle existe. D'un point de vue technique il me semble pas déconnant qu'aucun test n'est était fait dans ce sens et donc tu tombes surement sur un "bug", ou plutôt une limitation d'usage.
    Bref, au lieux de faire un Hide() et un Show() essaye de jouer directement sur les visibility (Visibility.Hidden et Visibility.Visible), ce qui évitera d'appeler des fonctions internes qui provoque ce phénomène.

    Sinon peut etre que tu devrais utiliser la navigationWindow qui va te permettre de rester sur la même page tout en changeant son contenu, un peu comme navigateur ou une application mobile.
    https://msdn.microsoft.com/fr-fr/lib...vs.110%29.aspx
    Salut

    Merci pour ta réponse.

    j'avais déjà essayé avec les visibility visible et hidden : même problème, malheureusement.

    J'ai espéré réussir à faire une opacité à 0% mais je n'y arrive pas.

  5. #5
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut
    Citation Envoyé par Fellerson Voir le message
    j'aimerais cacher la fenêtre ParamsAfficahge.xaml.cs pour pas que les 2 fenêtres soit superposées (pour un côté esthétique)
    Comme @micka132 l'a dit, l'affichage modale a son importance dans la bonne compréhension de l'application. Lorsque tu cliques en dehors d'une fenêtre modale, tu as un genre de "warning" envoyé par Windows pour d'indiquer que tu dois fermer cette fenêtre avant d'agir sur la fenêtre parente. Le comportement est logique et souhaité.

    Si tu veux vraiment pas que ça se voit (et je te le déconseilles), tu peux bricoler en affichant ta fenêtre par dessus sont parent de façon à le recouvrir.

Discussions similaires

  1. [2.x] [Symfony2] Form imbriqué avec proposition des elements déjà existant
    Par Elwood J. Blues dans le forum Symfony
    Réponses: 0
    Dernier message: 04/10/2011, 17h49
  2. [1.x] validation form imbriqué
    Par DevForFun dans le forum Symfony
    Réponses: 1
    Dernier message: 05/11/2010, 11h16
  3. Réponses: 28
    Dernier message: 17/06/2010, 17h33
  4. balise form imbriquée
    Par jep33 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 26/11/2008, 19h58
  5. balise form imbriquée
    Par amika dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 09/04/2006, 08h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo