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 :

WPF Est-ce possible de parcourir un element tel que Grid ? ou creer un tableau de Bouton en C# ?


Sujet :

Windows Presentation Foundation

  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    402
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 402
    Points : 337
    Points
    337
    Par défaut WPF Est-ce possible de parcourir un element tel que Grid ? ou creer un tableau de Bouton en C# ?
    Bonjour,

    Voila mon souci : Je réalise un démineur en WPF pour apprendre à mieux l'utiliser. Il y a peu je l'ai fais en mode console. Je peux le faire en WPF avec mes connaissances actuelles cependant c'est vraiment moche (la manière dont je le code) et ça ressemble plus à du bidouillage qu'autre chose parfois ...

    J'ai 25 boutons (bonne solution ? je pense pas) mis dans un Grid réparti en 5 colonnes et 5 lignes.

    Je traite chaque boutons au cas par cas et c'est pas vraiment cool ^^

    N'y a t-il pas un bon moyen pour traiter ça via un tableau se référent au Grid par exemple ?

    Je suis ouvert à toutes suggestions :]

    Merci à vous.

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    a mon avis avec un visualtreehelper tu peux parser tes elements qui se trouvent dans la grid
    si tu les creer dynamiquement
    tu peux facilement les mettre dans un tableau syle object [][]

    sinon les indications de grid c''est que tu peux retrouver la col et le row d'un UIElement avec Grid.GetColumn ou Grid.GetRow

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    402
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 402
    Points : 337
    Points
    337
    Par défaut
    Merci je vais me pencher la dessus.

    EDIT : Ikeas, qu'est-ce que vous appelez "créer dynamiquement" ? Parce que, en ce qui me concerne, je ne vois pas comment créer les boutons à part avec l'outil visuel qui permet de cliquer pour les déposer là ou on veut... j'espère me faire comprendre.

    Je suppose que ce n'est pas dynamique ^^ Comment peut-on faire autrement ? Maintenant je vois à peu prés comment utiliser les Grid.Column et Grid.Row donc avec ça je pourrais peut-être bien arriver à mes fins.

    Merci d'avance.

    EDIT 2: En fait le must serait de pouvoir créer un tableau de bouton via le code C# mais est-ce possible ?

  4. #4
    Membre régulier
    Inscrit en
    Novembre 2008
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 97
    Points : 106
    Points
    106
    Par défaut
    Bonjour,

    Voici un exemple de création dynamique.

    Code xaml :
    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
    <Grid x:Name="maGrid">
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition />
                <ColumnDefinition />
                <ColumnDefinition />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
     
            <Grid.RowDefinitions>
                <RowDefinition />
                <RowDefinition />
                <RowDefinition />
                <RowDefinition />
                <RowDefinition />
            </Grid.RowDefinitions>
        </Grid>
    Code behind en C#:
    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
    private void button_Click(object sender, EventArgs e)
            {
                Button button = (Button)sender;
                MessageBox.Show("Vous avez cliqué " + button.Tag.ToString());
            }
     
            public Window1()
            {
                InitializeComponent();
     
                for (int r = 0; r < 5; r++)
                {
                    for (int c = 0; c < 5; c++)
                    {
                        Button button = new Button();
     
                        //Texte du bouton
                        button.Content = r + "-" + c;
     
                        //Tag affiché lors d'un clic
                        button.Tag = r + "-" + c;
                        button.Click += new RoutedEventHandler(button_Click);
     
                        //Position dans la grid
                        Grid.SetRow(button, r);
                        Grid.SetColumn(button, c);
                        maGrid.Children.Add(button);
                    }
                }
            }
    Bonne continuation.

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    402
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 402
    Points : 337
    Points
    337
    Par défaut
    très bien merci je vais refaire ça comme ça :]

  6. #6
    Membre régulier
    Inscrit en
    Novembre 2008
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 97
    Points : 106
    Points
    106
    Par défaut
    Par contre ca ne respecte pas le pattern MVVM, mais pour débuter ca ira

  7. #7
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    402
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 402
    Points : 337
    Points
    337
    Par défaut
    J'ai une exception sur cette ligne là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TabBtn.Children.Add(button);
    Le nom est bon, il n'y a aucune erreur ou warning dans le code.

    mais l'exception :
    {"Une exception a été levée par la cible d'un appel."}
    provenant de
    System.Reflection.TargetInvocationException
    Je ne pense pas m'y prendre mal pourtant. J'ai testé en mettant en commentaire la ligne en question et ça marche mais forcement je n'ai pas de bouton :/

  8. #8
    Membre régulier
    Inscrit en
    Novembre 2008
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 97
    Points : 106
    Points
    106
    Par défaut
    Si tu regardes mon code, j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maGrid.Children.Add(button);
    où "maGrid" est le nom de ma Grid dans le code Xaml :

    A quoi correspond TabBtn dans ton code?

  9. #9
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    402
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 402
    Points : 337
    Points
    337
    Par défaut
    J'ai remplacé le maGrid par TabBtn tel que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TabBtn.Children.Add(button);
    et
    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
    <Grid x:Name="TabBtn" Height="280" Width="280">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="*"/>
                    <RowDefinition Height="*"/>
                    <RowDefinition Height="*"/>
                    <RowDefinition Height="*"/>
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>
            </Grid>
    Ça me mettrait une erreur si j'utilisais un nom différent sinon ?

    Merci pour votre aide en tous cas !

  10. #10
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    402
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 402
    Points : 337
    Points
    337
    Par défaut
    Mea Culpa, désolé, encore une erreur bête de ma part, j'ai tout simplement mal placé la ligne aprés mes boucles donc ça ne pouvait pas marcher

    Merci encore, grâce à vous je vais pouvoir bien avancer dans ma petite application

  11. #11
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    402
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 402
    Points : 337
    Points
    337
    Par défaut
    Re-bonjour,

    Juste un dernier point, grâce à vous j'ai réussi à réduire de 25 fonctions mon programme (une fonction pour un clique sur bouton ).

    Mais j'aimerais savoir si il y a moyen de parcourir l'objet qui représente ma Grid, ici TabBtn ? C'est pour modifier un paramètre sur chaque bouton, j'essaye de trouver une méthode parmi celle proposé par VS2010 mais je ne trouve pas.

    Pour l'instant ça ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    if (tab[Grid.GetRow(button), Grid.GetColumn(button)] == '¤')
                {
                    MessageBox.Show("Vous avez perdu ...");
                    for (short i = 0; i < 5; i++)
                        for (short j = 0; j < 5; j++)
                        {
                            //Je voudrais faire appel à chaque élément de TabBtn selon i et j
                            //TabBtn.MonEnfant(i,j);
     
                        }
                    TabBtn.IsEnabled = false;
                }
    Quelqu'un saurait-il s'il vous plait ?

  12. #12
    Membre régulier
    Inscrit en
    Novembre 2008
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 97
    Points : 106
    Points
    106
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach (Button b in TabBtn.Children)
    {
                    //Traitement de b
    }

  13. #13
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    402
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 402
    Points : 337
    Points
    337
    Par défaut
    Merci beaucoup !

    Mais j'aimerais savoir si il y a une méthode qui prend en compte les paramètres colonne et ligne. En fait j'ai une fonction récursive qui modifie les boutons qui se touchent et qui possèdent le même contenu, c'est donc pour ça que j'utilise les paramètres donnés plus haut.

    Cependant Merci beaucoup, j'avance j'avance ! J'espère ne pas en demander trop, je suis à la découverte du WPF seulement.

  14. #14
    Membre régulier
    Inscrit en
    Novembre 2008
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 97
    Points : 106
    Points
    106
    Par défaut
    Je ne crois pas qu'une telle méthode existe.

    Cependant, tu as deux solutions :

    1) Tu crées ta propre méthode de recherche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    private Button SearchButton(int column, int row)
            {
                foreach (Button b in TabBtn.Children)
                    if (Grid.GetRow(b) == row && Grid.GetColumn(b) == column)
                        return b;
     
                return null;
            }
    et tu l'utilises :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for (short i = 0; i < 5; i++)
                    for (short j = 0; j < 5; j++)
                    {
                        Button b = SearchButton(i, j);
                        // Traitement de b
                    }
    Mais cette méthode n'est pas très propre car elle te fait faire beaucoup de boucles au final.

    2) Sinon tu crées une seule et unique boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    foreach (Button b in TabBtn.Children)
                {
                    int i = Grid.GetRow(b);
                    int j = Grid.GetColumn(b);
                    //Traitement de b selon i et j.
                }

  15. #15
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    402
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 402
    Points : 337
    Points
    337
    Par défaut
    Merci pour tout Cecile5, toutes ces propositions sont très intéressantes
    Je vais clore le sujet car j'ai tout ce dont j'avais besoins, merci encore !

    Et bonne continuation

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 09/06/2015, 19h58
  2. Réponses: 2
    Dernier message: 07/09/2010, 12h26
  3. Est il possible d'ajouter des composants WPF a un simple form?
    Par NoussaL dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 30/10/2008, 15h12
  4. Réponses: 13
    Dernier message: 13/08/2008, 17h55
  5. [CR] Est il possible de créer des univers avec Seagate Info?
    Par Frank dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 27/06/2002, 16h22

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