Que les élement d'une liste retourne automatiquement a la ligne [Résolu/Fermé]

Signaler
Messages postés
141
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
16 novembre 2020
-
Messages postés
15164
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
30 novembre 2020
-
Bonjour, je débute en programmation WPF et je cherche que ma ListBox qui contient une liste d'image accompagner de son bouton (qui lui est associé) retourne automatiquement à la ligne, une fois cette ligne pleine. (comme pour un wrap) Pouvez-vous m'aider ?? Merci d'avance de vos conseilles.

                <ListBox>
                    <ListBox.ItemsPanel>
                        <ItemsPanelTemplate>
                            <WrapPanel/>
                        </ItemsPanelTemplate>
                    </ListBox.ItemsPanel>
                </ListBox>
                
                <WrapPanel HorizontalAlignment="Stretch"  >

                    <ListBox Name="List_pour_Serie">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                                <StackPanel>
                                    <Button Content="{Binding Nom}"></Button>
                                    <Image Height="250" Width="200" Source="{Binding Images}"/>
                                </StackPanel>
                            </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
                </WrapPanel>



Cordialement.

4 réponses

Messages postés
15164
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
30 novembre 2020
620
Bonjour

d'abord, merci à MadMyke d'avoir corriger ta coloration syntaxique, voir ici comment bien t'en servir pour tes prochains posts.

Si c'est ça que tu veux


        <ListBox ItemsSource="{Binding SourceDonnees}" Margin="277,31,47,39" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <Button Content="{Binding Nom}"></Button>
                        <Image Height="100" Width="100" Source="{Binding Images}"/>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

Le scrollviewer horizontal doit être désactivé, et j'ai mis les images plus petites que toi.
Messages postés
141
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
16 novembre 2020

Oui c'est exactement ça ! Merci beaucoup pour votre aide !
Cordialement.
Messages postés
15164
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
30 novembre 2020
620
De rien, pense à marquer le sujet résolu avec la roue dentée tout en haut du fil.
Messages postés
141
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
16 novembre 2020

Bonjour, j'aimerais un renseignement s'il vous plait... Serais-t-il possible de passer la valeur du Click dans la balise bouton grâce à un Binding ?
Merci d'avance.

Cordialement.
Messages postés
15164
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
30 novembre 2020
620
Peux tu préciser ta question?

Messages postés
141
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
16 novembre 2020

Avec le code qui vous m'avez donnée ci-dessus, j'ai voulu ajouter un événement Click, si on le fait de la façon "habituelle" c'est à dire :

 Click="Button_Click"


Ça applique le même évènement à tout les boutons. Or je veux que chaque bouton d'image "conduit" vers une fenêtre différente. J'ai donc voulu passer les "Button_Click" par un Binding. Pour ça j'ai créer dans ma classe une nouvelle valeur.


 public string Appelation { get; set; }
        public string Description { get; set; }
        public string Images { get; set; }

        public Genre DataSource { get; internal set; }
        public String Click { get; set; } //nouvelle valeur qui permet de passer le Button_Click


Cependant cette méthode ne fonctionne pas ...
Quand je tentes de lancer l'application ça m'affiche une exception : "System.Windows.Markup.XamlParseException : ''La valeur fournie sur 'System.Windows.Data.Binding' a levé une exception.'"
Messages postés
15164
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
30 novembre 2020
620
Ok,
Une propriété, c'est une donnée sur l'objet.
Un évènement c'est un truc qui arrive.

Par exemple dans la vie un Verre est objet, qu'il soit vide, plein, partiellement rempli est une donnée, que ce soit de l'eau, du sirop ou de la bière en est une autre.

Par contre, qu'il tombe par terre et se casse est un évènement, qu'il se reverse en est un autre.

Une propriété ça se binde, un évènement non (enfin, ça peut, mais c'est compliqué), et surtout t'en as pas besoin.

Pour mon exemple, j'ai écrit une class Class3
    class Class3
    {
        public Class3(string LeNom, string PathImage)
        {
            Nom = LeNom;
            Images = new BitmapImage(new Uri(PathImage));
        }
        public string Nom { get; set; }

        public ImageSource Images { get; set; }
    }


Dans la méthode abonnée au click de chaque bouton, je vais déterminer de quel bouton il s'agit, puis de quel Class3 il s'agit, et en fonction afficher la bonne fenêtre
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Button but = sender as Button;
            if (but == null)
                return;//sender n'était pas un bouton, il y a erreur => on s'en va

            Class3 source = but.DataContext as Class3;
            if (source == null)
                return;//le bouton n'est pas un bouton bindé sur un objet Class3, il y a erreur => on s'en va

            //option  1, on choisit en fonction de l'objet, avec son nom par exemple
            switch(source.Nom)
            {
                case "Patate 1":
                    //ici le code pour afficher la fenêtre correspondant Patate 1
                    break;
            }

        }