Hello !

Je me suis décidé à me mettre au WPF et pour avoir qqch de concret à faire, je développe un jeu de yahtzee.

J'ai donc affiché des images représentant les dés et je voudrais lors du click sur le bouton "Roll !" que les dés se mettent à jour (logique).

Si c'est juste changer d'image, pas de souci. Le truc, c'est que je voudrais donner une impression de "roulement". Du coup, je fais une boucle dans laquelle je change l'image. Seulement, l'affichage ne se rafraichit que quand le traitement est terminé (à la fin de la boucle donc) et on ne voit donc le changement qu'une seule fois (au lieu de plusieurs fois très vite).

Voici le code que j'ai produit pour cette partie :
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
    Private Sub btnRoll_Click(sender As System.Object, e As System.Windows.RoutedEventArgs)
        listDicesToRoll.Clear()
        For Each ctl As CheckBox In listDicesCheckbox
            If Not ctl.IsChecked Then
                Select Case ctl.Name
                    Case "ckbDice1"
                        listDicesToRoll.Add(imgDice1)
                    Case "ckbDice2"
                        listDicesToRoll.Add(imgDice2)
                    Case "ckbDice3"
                        listDicesToRoll.Add(imgDice3)
                    Case "ckbDice4"
                        listDicesToRoll.Add(imgDice4)
                    Case "ckbDice5"
                        listDicesToRoll.Add(imgDice5)
                End Select
            End If
        Next
        Dim x As Integer = 0
        Dim rnd As New Random()
        For i As Integer = 0 To 20
            For Each imgCtl As Image In listDicesToRoll
                x = rnd.Next(5) + 1
                Dim img As New BitmapImage
                img.BeginInit()
                img.UriSource = New Uri("Resources\de" & x.ToString & ".png", UriKind.Relative)
                img.EndInit()
                imgCtl.Source = img
            Next
            i += 1
        Next
        iRollsLeft -= 1
        If iRollsLeft <= 1 Then
            txtRolls.Text = CStr(iRollsLeft) & " roll left..."
            If iRollsLeft = 0 Then
                btnRoll.IsEnabled = False
            End If
        Else
            txtRolls.Text = CStr(iRollsLeft) & " rolls left..."
        End If
    End Sub
Ce n'est clairement pas parfait... Je chipote encore pas mal. Par exemple, pour les dés, au niveau visuel j'ai :

- un stackpanel (nommé spDices) en orientation horizontal qui contient 5 fois :
un stackpanel qui contient une image et une checkbox

Comment parcourir avec une boucle for each les comboboxes contenues dans spDices ?

Si je fais :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
For Each ctl as CheckBox in spDices.Children.OfType(Of CheckBox)()
Forcément il ne trouve rien vu que les enfants sont des stackpanels... Bref, faut être récursif mais je n'avais pas envie de commencer à tester le type de l'enfant pour voir si je dois le parcourir aussi... Du coup, j'ai mis les checkboxes dans une liste et je parcours la liste... Une idée de comment améliorer cela ?

Merci d'avance,

Griftou.