Menu

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

Messages postés
23
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
19 mai 2019
-
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.
Afficher la suite 

Votre réponse

4 réponses

Messages postés
13294
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
19 mai 2019
472
0
Merci
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.
Hamster18
Messages postés
23
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
19 mai 2019
-
Oui c'est exactement ça ! Merci beaucoup pour votre aide !
Cordialement.
Commenter la réponse de Whismeril
Messages postés
13294
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
19 mai 2019
472
0
Merci
De rien, pense à marquer le sujet résolu avec la roue dentée tout en haut du fil.
Hamster18
Messages postés
23
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
19 mai 2019
-
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.
Commenter la réponse de Whismeril
Messages postés
13294
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
19 mai 2019
472
0
Merci
Peux tu préciser ta question?

Hamster18
Messages postés
23
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
19 mai 2019
-
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.'"
Commenter la réponse de Whismeril
Messages postés
13294
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
19 mai 2019
472
0
Merci
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;
            }

        }
Commenter la réponse de Whismeril