Laden...

Mehrere Labels gleichzeitig verändern

Letzter Beitrag vor 7 Monaten 20 Posts 667 Views
Mehrere Labels gleichzeitig verändern

Ich habe hier folgenden Code, der Teil einer if-Abfrage ist:

if ( bla bla)
{
    for (int i = 0; i < wuerfel.Length; i++)
    {
        wuerfelKlick[i] = false;
        wuerfel[i] = zufallszahlen.Next(1, 7);
    }
    wuerfel1_img.Visibility = Visibility.Visible;
    wuerfel2_img.Visibility = Visibility.Visible;
    wuerfel3_img.Visibility = Visibility.Visible;
    wuerfel4_img.Visibility = Visibility.Visible;
    wuerfel5_img.Visibility = Visibility.Visible;
    wuerfel6_img.Visibility = Visibility.Visible;
}

Wie schaffe ich es, dass ich alle Labels gleichzeit ändern kann?
Die Labelnamen vergibt man ja in im XAML Teil.

<Image x:Name="wuerfel1_img" Grid.Row="5" Grid.Column="2" HorizontalAlignment="Center" VerticalAlignment="Center" MouseDown="wuerfel1_img_MouseDown"/>
<Image x:Name="wuerfel2_img" Grid.Row="5" Grid.Column="3" HorizontalAlignment="Center" VerticalAlignment="Center" MouseDown="wuerfel2_img_MouseDown"/>
<Image x:Name="wuerfel3_img" Grid.Row="5" Grid.Column="4" HorizontalAlignment="Center" VerticalAlignment="Center" MouseDown="wuerfel3_img_MouseDown"/>
<Image x:Name="wuerfel4_img" Grid.Row="5" Grid.Column="5" HorizontalAlignment="Center" VerticalAlignment="Center" MouseDown="wuerfel4_img_MouseDown"/>
<Image x:Name="wuerfel5_img" Grid.Row="5" Grid.Column="6" HorizontalAlignment="Center" VerticalAlignment="Center" MouseDown="wuerfel5_img_MouseDown"/>
<Image x:Name="wuerfel6_img" Grid.Row="5" Grid.Column="7" HorizontalAlignment="Center" VerticalAlignment="Center" MouseDown="wuerfel6_img_MouseDown"/>

Wäre ja schön, wenn man das auch irgendwie Indexieren könnte und dann mit einer Forschleife oder ähnlichem macht.
Also so in der Art:

for (int i = 1; i < wuerfel.Length; i++)
    {
        wuerfel{i}_img.Visibility = Visibility.Visible;
    }
    

Keine Ahnung, wie ich das besser ausdrücken soll, was ich vor habe.
Ich hoffe ihr könnt mir folgen.

Du kannst diese Würfel-Images im Constructor direkt nach InitializeComponent() in ein Array schreiben um dieses dann für solche Zwecke zu verwenden.

Alternativ (und grundsätzlich empfehlenswert) ist die Verwendung von MVVM und Binding.

Hat die Blume einen Knick, war der Schmetterling zu dick.

WPF ist leider ein Framework, bei dem Du mit Deinem Try-and-Error vorgehen niemals verstehen kannst, was die Konzepte sind und wie man diese anwenden muss. Das zeigt die Erfahrung..
Du wirst nicht drum herum kommen, die Grundlagen von WPF erlernen zu müssen. WPF wurde zudem so umgesetzt, dass MVVM quasi ein Pflichtkonzept ist. Du kommst nicht drum herum MVVM zu verwenden, wenn Deine Anwendung nicht vollgestopft mit Workarounds werden soll.

Aaaah okay. Vielen Dank.
das hilft mir schonmal ordentlich weiter.

Sooo....ich wollte das Thema heute nochmal angehen. Mir ist noch nicht klar, wie das funktioniert.
In der XAML habe ich folgendes stehen:

<Image x:Name="wuerfel1_img" Grid.Row="6" Grid.Column="2" Grid.RowSpan="2" HorizontalAlignment="Center" VerticalAlignment="Center" MouseDown="wuerfel1_img_MouseDown"/>
<Image x:Name="wuerfel2_img" Grid.Row="6" Grid.Column="3" Grid.RowSpan="2" HorizontalAlignment="Center" VerticalAlignment="Center" MouseDown="wuerfel2_img_MouseDown"/>
<Image x:Name="wuerfel3_img" Grid.Row="6" Grid.Column="4" Grid.RowSpan="2" HorizontalAlignment="Center" VerticalAlignment="Center" MouseDown="wuerfel3_img_MouseDown"/>
<Image x:Name="wuerfel4_img" Grid.Row="6" Grid.Column="5" Grid.RowSpan="2" HorizontalAlignment="Center" VerticalAlignment="Center" MouseDown="wuerfel4_img_MouseDown"/>
<Image x:Name="wuerfel5_img" Grid.Row="6" Grid.Column="6" Grid.RowSpan="2" HorizontalAlignment="Center" VerticalAlignment="Center" MouseDown="wuerfel5_img_MouseDown"/>
<Image x:Name="wuerfel6_img" Grid.Row="6" Grid.Column="7" Grid.RowSpan="2" HorizontalAlignment="Center" VerticalAlignment="Center" MouseDown="wuerfel6_img_MouseDown"/>

Im Code möchte ich dann die Namen ansprechen. Also kein Bild, sondern den Namen und dieses Image Element dann unsichtbar machen.
Derzeit spreche ich die Namen immer einzeln an.

wuerfel1_img.Visibility = Visibility.Hidden;
wuerfel2_img.Visibility = Visibility.Hidden;
wuerfel3_img.Visibility = Visibility.Hidden;
wuerfel4_img.Visibility = Visibility.Hidden;
wuerfel5_img.Visibility = Visibility.Hidden;
wuerfel6_img.Visibility = Visibility.Hidden;

Das würde ich aber gerne mit einer Schleife erledigen, da ich häufiger im Code auf den Namen zurückgreifen muss.
So beispielsweise:

Random zufallszahlen = new Random();
for (int i = 0; i < 6; i++)
{
    wuerfel[i] = zufallszahlen.Next(1, 7);
}


if (wuerfel[0] == 1)
{
    wuerfel1_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild1.png", UriKind.Relative));
}
else if (wuerfel[0] == 2)
{
    wuerfel1_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild2.png", UriKind.Relative));
}
else if (wuerfel[0] == 3)
{
    wuerfel1_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild3.png", UriKind.Relative));
}
else if (wuerfel[0] == 4)
{
    wuerfel1_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild4.png", UriKind.Relative));
}
else if (wuerfel[0] == 5)
{
    wuerfel1_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild5.png", UriKind.Relative));
}
else if (wuerfel[0] == 6)
{
    wuerfel1_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild6.png", UriKind.Relative));
}

Das muss ich derzeit 6 Mal machen. Für jeden Würfel einzeln, damit ich direkt den Namen des Elements ansprechen kann.
Ich möchte also kein Bild, sondern die Elemente in ein Array packen.
Geht das?
Edit: Auf der verlinkten Seite wird das Beispiel geben:


TextBox[] textBoxes = new TextBox[] { this.textBox1, this.textBox2, this.textBox3 };

Ich habe ja keine Textbox, sondern Image-Elemente, daher habe ich das probiert:

Image[] wuerfel_images = new Image[] { this.wuerfel1_img, this.wuerfel2_img, this.wuerfel3_img, this.wuerfel4_img, this.wuerfel5_img, this.wuerfel6_img };

Aber stimmt das?
Wenn ich das dort platziere:

InitializeComponent();
Image[] wuerfel_images = new Image[] { this.wuerfel1_img, this.wuerfel2_img, this.wuerfel3_img, this.wuerfel4_img, this.wuerfel5_img, this.wuerfel6_img };

Dann kann ich da nicht drauf zugreifen.

private void Wuerfelunsichtbar()
{   
    for (int i = 0; i < wuerfel_images.Length; i++)
    {
        wuerfel_images[i].Visibility = Visibility.Hidden;
    }
}

Fehler    CS0103    Der Name "wuerfel_images" ist im aktuellen Kontext nicht vorhanden.    Farkle    C:\Users\Marco\source\repos\Spielereien\Farkle\MainWindow.xaml.cs    84    Aktiv

Probiere es doch aus.

Bedenke nur, daß die Indizes dann von 0 an anfangen (anstatt bei 1 wie bei den Würfeln).

Edit: Die Fehlermeldung bei deinem letzten Edit sagt ja, daß es so diese Variable nicht kennt (da sie lokal definiert ist). Du mußt sie also als Member der Klasse anlegen (und trotzdem die Initialisierung im Konstruktor vornehmen).

Hatte gerade noch den Beitrag editiert.
Ich bekomme die Fehlermeldung:

Schweregrad    Code    Beschreibung    Projekt    Datei    Zeile    Unterdrückungszustand
Fehler    CS0103    Der Name "wuerfel_images" ist im aktuellen Kontext nicht vorhanden.    Farkle    C:\Users\Marco\source\repos\Spielereien\Farkle\MainWindow.xaml.cs    84    Aktiv

Da haben sich unsere Beitragsänderungen überschnitten. Schau noch mal in meinen vorherigen Beitrag.

Ja wunderbar. So klappt das.

Ich habe jetzt unter

public partial class MainWindow : Window

Das Array erstellt mit:

Image[] wuerfel_images = new Image[6];

Und dann unter :

public MainWindow()
InitializeComponent();
wuerfel_images[0] = this.wuerfel1_img;
wuerfel_images[1] = this.wuerfel2_img;
wuerfel_images[2] = this.wuerfel3_img;
wuerfel_images[3] = this.wuerfel4_img;
wuerfel_images[4] = this.wuerfel5_img;
wuerfel_images[5] = this.wuerfel6_img;

Kann ich das auch noch eleganter lösnen, anstatt ich as Array manuell befülle?

Ja, so wie du es vorher hattest, also

wuerfel_images = new Image[] { this.wuerfel1_img, this.wuerfel2_img, this.wuerfel3_img, this.wuerfel4_img, this.wuerfel5_img, this.wuerfel6_img };

Und bei der Definition benötigst du dann keine Initialisierung mehr (da das Array ja mit dem obigen Code überschrieben wird):

private Image[] wuerfel_images; // ich schreibe immer explizit den Zugriffsmodifizierer dazu

Sehr gut.
Das funktioniert.
Aus:

            if (wuerfel[0] == 1)
            {
                wuerfel1_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild1.png", UriKind.Relative));
            }
            else if (wuerfel[0] == 2)
            {
                wuerfel1_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild2.png", UriKind.Relative));
            }
            else if (wuerfel[0] == 3)
            {
                wuerfel1_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild3.png", UriKind.Relative));
            }
            else if (wuerfel[0] == 4)
            {
                wuerfel1_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild4.png", UriKind.Relative));
            }
            else if (wuerfel[0] == 5)
            {
                wuerfel1_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild5.png", UriKind.Relative));
            }
            else if (wuerfel[0] == 6)
            {
                wuerfel1_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild6.png", UriKind.Relative));
            }


            if (wuerfel[1] == 1)
            {
                wuerfel2_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild1.png", UriKind.Relative));
            }
            else if (wuerfel[1] == 2)
            {
                wuerfel2_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild2.png", UriKind.Relative));
            }
            else if (wuerfel[1] == 3)
            {
                wuerfel2_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild3.png", UriKind.Relative));
            }
            else if (wuerfel[1] == 4)
            {
                wuerfel2_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild4.png", UriKind.Relative));
            }
            else if (wuerfel[1] == 5)
            {
                wuerfel2_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild5.png", UriKind.Relative));
            }
            else if (wuerfel[1] == 6)
            {
                wuerfel2_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild6.png", UriKind.Relative));
            }


            if (wuerfel[2] == 1)
            {
                wuerfel3_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild1.png", UriKind.Relative));
            }
            else if (wuerfel[2] == 2)
            {
                wuerfel3_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild2.png", UriKind.Relative));
            }
            else if (wuerfel[2] == 3)
            {
                wuerfel3_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild3.png", UriKind.Relative));
            }
            else if (wuerfel[2] == 4)
            {
                wuerfel3_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild4.png", UriKind.Relative));
            }
            else if (wuerfel[2] == 5)
            {
                wuerfel3_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild5.png", UriKind.Relative));
            }
            else if (wuerfel[2] == 6)
            {
                wuerfel3_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild6.png", UriKind.Relative));
            }



            if (wuerfel[3] == 1)
            {
                wuerfel4_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild1.png", UriKind.Relative));
            }
            else if (wuerfel[3] == 2)
            {
                wuerfel4_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild2.png", UriKind.Relative));
            }
            else if (wuerfel[3] == 3)
            {
                wuerfel4_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild3.png", UriKind.Relative));
            }
            else if (wuerfel[3] == 4)
            {
                wuerfel4_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild4.png", UriKind.Relative));
            }
            else if (wuerfel[3] == 5)
            {
                wuerfel4_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild5.png", UriKind.Relative));
            }
            else if (wuerfel[3] == 6)
            {
                wuerfel4_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild6.png", UriKind.Relative));
            }


            if (wuerfel[4] == 1)
            {
                wuerfel5_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild1.png", UriKind.Relative));
            }
            else if (wuerfel[4] == 2)
            {
                wuerfel5_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild2.png", UriKind.Relative));
            }
            else if (wuerfel[4] == 3)
            {
                wuerfel5_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild3.png", UriKind.Relative));
            }
            else if (wuerfel[4] == 4)
            {
                wuerfel5_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild4.png", UriKind.Relative));
            }
            else if (wuerfel[4] == 5)
            {
                wuerfel5_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild5.png", UriKind.Relative));
            }
            else if (wuerfel[4] == 6)
            {
                wuerfel5_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild6.png", UriKind.Relative));
            }


            if (wuerfel[5] == 1)
            {
                wuerfel6_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild1.png", UriKind.Relative));
            }
            else if (wuerfel[5] == 2)
            {
                wuerfel6_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild2.png", UriKind.Relative));
            }
            else if (wuerfel[5] == 3)
            {
                wuerfel6_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild3.png", UriKind.Relative));
            }
            else if (wuerfel[5] == 4)
            {
                wuerfel6_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild4.png", UriKind.Relative));
            }
            else if (wuerfel[5] == 5)
            {
                wuerfel6_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild5.png", UriKind.Relative));
            }
            else if (wuerfel[5] == 6)
            {
                wuerfel6_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild6.png", UriKind.Relative));
            }

Wurde jetzt:

 for (int i = 0; i < wuerfel.Length; i++)
 {
     for (int j = 1; j < wuerfel_images.Length+1; j++)
     {
         if (wuerfel[i] == j)
         {
             wuerfel_images[i].Source = new BitmapImage(new Uri($@"/Farkle;component/img/wuerfelbild{j}.png", UriKind.Relative));
         }
     }
 }

Vielen Dank für die Hilfe!

Auch das läßt sich noch weiter vereinfachen (so wie ich es dir in einem deiner anderen Themen für die wuerfelCheck- Initialisierung gezeigt hatte):

for (int i = 0; i < wuerfel.Length; i++)
{
    wuerfel_images[i].Source = new BitmapImage(new Uri($@"/Farkle;component/img/wuerfelbild{wuerfel[i]}.png", UriKind.Relative));
}

Da die bisherige innere Schleife ja nur bei wuerfel[i] == j ausgeführt werden soll, kann man es gleich so schreiben, daß es nur für diesen Wert ausgeführt wird, s.a.  Introducing the for-if anti-pattern.

Das muss ich erstmal analysieren und verstehen.
Überprüft dein Ausdruck auch, welcher Wert in wuerfel[] steckt?

Wenn ich deins mal durchspiele und für i einfach mal eine 0 einsetze ergibt sich ja folgendes:
wuerfel_images[0] (also das Image Element für den ersten Würfel) ist wuerfel[0].png.
-> Das gibt es gar nicht.

Aber selbst wenn ich wuerfel[i+1] einsetze, dann wird auf das Image Element 0 das Würfelbild 1 gesetzt.
Es fehlt die Überprüfung, ob der erste Würfel nicht eine 3 oder 4 oder 6 ist.

Entweder verstehe ich das noch nicht, oder es war nicht klar genug ausgedrückt, was ich dort mache?

Edit:
Der Code funktioniert, aber ich verstehe nicht, was dort gemacht wird.....

Zitat von Patsche

Das muss ich erstmal analysieren und verstehen.
Überprüft dein Ausdruck auch, welcher Wert in wuerfel[] steckt?

Th69 hat Dir ein grundlegenden Hinweis gegeben, wie man sowas richtig löst.
Eine Validierung kannst ja selbst hinzufügen...die Idee ist ja nicht, dass wir Dir hier den fertigen Code liefern, sondern Dir den Weg dahin zeigen.

Der Code funktioniert, aber ich verstehe nicht, was dort gemacht wird.....

Auch hier nochmal der Rat: Du solltest wirklich ein Anfängertutorial durch machen und das Try-and-Error Prinzip mal beiseite legen. 
Es gibt keine andere Chance die Grundlagen zu erlernen als zu Lesen oder Dir einen Lehrer zu suchen, der Dir das aktiv beibringt. In Th69 Sample sind wirklich nur Basis-"Befehl" enthalten. Das lernt man in wenigen Stunden (als reiner Vergleich: Schleifen kommen bei IT Schülern i.d.R. in der 3. Lernstunde dran).
Du bist schneller und verstehst, was Du machst, wenn Du jetzt mal 2-3 Tage in Grundlagen investierst. Du hast die Tipps nicht umsonst von mehreren Stellen nun bekommen. Das ist wirklich so.

Ich verstehe nicht, warum in Foren immer der Hinweis gegeben wird zu lesen. Klar muss man lesen. Aber wenn man das nicht versteht, dann fragt man doch nach.
Dafür sind Foren doch da.
Und meine Herangehensweise ist ja nicht falsch. Sie hat funktioniert, auch wenn ich 2 Schleifen
brauchte.
Ich finde nach 7 Tagen Hobbyprogrammierung habe ich schon deutliche Fortschritte gemacht.
Und manchmal muss man auch einfach mal mit dem Wissen loslegen, das man hat.
Du magst der Meinung sein, dass try and error nicht funktioniert, doch so lerne ich persönlich am besten.
Ich muss erst auf ein Problem stoßen und mich dann damit beschäftigen.

Wer keine Lust oder Interesse hat einem Anfänger wie mir zu helfen, dann ist das für mich auch okay.
Ich finde es nur immer doof von oben herab zu schreiben, was man alles nicht kann.
Das ist leider ein typisches IT-Foren Problem.
Ich bin sehr aktiv in der Debian und Linux Community und muss meine Kollegen ständig dazu ermahnen, dass auch Anfängerfragen in Foren berechtigt sind.

Aber ich will jetzt auch nicht weiter ausholen. Das Geschriebene reicht.

Ich hab durch Deinen anderen Beitrag ("Leider sind IT Foren da sehr harsch in Ton und Umgang mit Anfängern.") schon fast befürchtet, dass sowas kommt... ist irgendwie immer das gleiche mit aktiven Hinweisen etc... Es war eine rein sachliche Kritik Deines Vorgehens, und das ist völlig legitim. Wenn Du meinst, dass das von "oben herab" ist... well...

Die Idee eines Forums ist es grundlegende Probleme zu lösen. Ein Forum ist aber kein Ersatz, dass Du die Grundlagen nicht lernen musst oder hier jemand Dein privater Lehrer ist.

> Du magst der Meinung sein, dass try and error nicht funktioniert, doch so lerne ich persönlich am besten.

Du kannst ruhig weiter mit dieser Haltung versuchen voran zu kommen (das is wirklich deine Sache und mir egal) - wir haben hier schon genug scheitern gesehen. Wenn man ein paar Jahre mit Azubis, Studenten und anderen Anfängern zutun hatte; man kann sehr einfach erkennen, wer mit Try and Error vorgegangen ist und wer wirklich aktiv lernt. Ich kann Dir in 100% der Fälle sagen, dass die Try-and-Error Leute den anderen nicht annähernd das Wasser reichen können - einfach weil sie verstehen, was sie tun. Auch ich hab so angefangen - ich sags Dir also aus Erfahrung.

Von uns sind viele in der Ausbildung tätig, wir helfen aktiv und gerne - niemand will Dir was böses. Also nicht patzig sein, nur weil wir Dir helfen und vielleicht das ein oder andere kritisieren.
Es ist ein reiner Tipp, wie Du selbst besser voran kommst.

Dann haben wir einfach verschiedene Vorstellungen davon, wofür ein Forum da ist.
Ich bin auch nicht patzig oder genervt.
Es ist einfach ein reine Feststellung meinerseits.
Und nochmal:
Das ist ein Hobby. Wer mir nicht helfen möchte, muss es nicht tun.
Wenn ich einen Hinweis nicht verstehe, dann frage ich eben nach. Es ist ja nicht so, dass ich einfach Frage ohne es vorher selbst versucht zu haben, es zu lösen.
Aber wir drehen uns im Kreis.
Wir haben verschiedene Ansichten.
Und damit ist die Sache für mich erledigt.

Jetzt habe ich es verstanden.
Nehmen wir mal an der erste Würfel ist eine 5.
Dann wäre wuerfel[0] = 5

Wenn ich jetzt die for-Schleife durchgehe:

for (int i = 0; i < wuerfel.Length; i++)
{
    wuerfel_images[i].Source = new BitmapImage(new Uri($@"/Farkle;component/img/wuerfelbild{wuerfel[i]}.png", UriKind.Relative));
}

wuerfel_image[0] wäre dann wuerfel1_img.
Also das erste Image-Element, welches den ersten Würfel anzeigt.

Dann würde da jetzt das Bild angezeigt werden, weches  "/img/wuerfelbild5.png heisst. Also die 5.
Es muss gar nicht mehr eine extra Schleife durchlaufen werden, weil ja schon feststeht, was im Würfel-Array drin ist.
Auf die Idee es so zu machen wäre ich nie gekommen.
Danke für den Hinweis.

Ich habe dir mal ein kleines Projekt angehängt, wo du sehen kannst, was wir mit MVVM meinen und warum das am Ende "einfacher" ist.

Ja, es ist eine Umstellung wenn man nicht mehr alles auf einmal macht und danach ist es eben einfacher, weil man nicht mehr alles auf einmal macht.

Der eigentliche Teil (Logik) findet hier statt:

public class MainViewModel : ViewModelBase
{
    private readonly ObservableCollection<Dice> _dices;
    public ReadOnlyObservableCollection<Dice> Dices { get; }
    [Reactive] public int DiceCount { get; set; } = 6;
    public ReactiveCommand<Unit, Unit> RollDicesCommand { get; }

    public MainViewModel()
    {
        _dices = [];
        Dices = new( _dices );

        RollDicesCommand = ReactiveCommand.CreateFromTask( OnRollDiceCommandAsync );
    }

    private async Task OnRollDiceCommandAsync()
    {
        // Wir merken uns, wieviele Würfel wir werfen sollen wenn dieses Kommando gestartet wird
        var diceCount = DiceCount;
        // Alten Wurf leeren
        _dices.Clear();
        // Wir simulieren das Würfeln ... es dauert eben, bis die Würfel gerüttelt, geschüttelt, geworfen und zur Ruhe gekommen sind
        await Task.Delay( 500 );
        // Zufälliges Erzeugen der Würfelwerte
        var randomDiceValues = Random.Shared.GetItems<DiceValue>( DiceValue.Values.ToArray(), diceCount );
        // Aus den Würfelwerten erzeugen wir Würfel und tragen diese in die Liste ein, die den Wurf repräsentiert
        foreach ( var item in randomDiceValues.Select( e => new Dice( e ) ) )
        {
            _dices.Add( item );
        }
    }
}

public record Dice( DiceValue Value );

public record DiceValue( int Value )
{
    public int Value { get; } = Value < 1 || Value > 6 ? throw new ArgumentOutOfRangeException( nameof( Value ) ) : Value;

    public static ImmutableHashSet<DiceValue> Values = [new( 1 ), new( 2 ), new( 3 ), new( 4 ), new( 5 ), new( 6 )];
}

Die (mehr oder wenige) ansprechende Darstellung findet an einer ganz anderen Stelle statt, weil diese bei dem Logik-Gedöns eh nur stört.

    <DataTemplate x:Key="Template.Dice.Image" DataType="{x:Type vm:Dice}">
        <Border Margin="5"
                Padding="5"
                BorderBrush="Black"
                BorderThickness="1"
                CornerRadius="10">
            <Image Height="60">
                <Image.Style>
                    <Style TargetType="Image">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Value.Value}" Value="1">
                                <Setter Property="Source" Value="{StaticResource Bitmap.Dice.One}" />
                            </DataTrigger>
                            <DataTrigger Binding="{Binding Value.Value}" Value="2">
                                <Setter Property="Source" Value="{StaticResource Bitmap.Dice.Two}" />
                            </DataTrigger>
                            <DataTrigger Binding="{Binding Value.Value}" Value="3">
                                <Setter Property="Source" Value="{StaticResource Bitmap.Dice.Three}" />
                            </DataTrigger>
                            <DataTrigger Binding="{Binding Value.Value}" Value="4">
                                <Setter Property="Source" Value="{StaticResource Bitmap.Dice.Four}" />
                            </DataTrigger>
                            <DataTrigger Binding="{Binding Value.Value}" Value="5">
                                <Setter Property="Source" Value="{StaticResource Bitmap.Dice.Five}" />
                            </DataTrigger>
                            <DataTrigger Binding="{Binding Value.Value}" Value="6">
                                <Setter Property="Source" Value="{StaticResource Bitmap.Dice.Six}" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </Image.Style>
            </Image>
        </Border>
    </DataTemplate>

Fröhliches Herumspielen.

Hat die Blume einen Knick, war der Schmetterling zu dick.