Laden...

Farbe Button1 ändern, wenn Button2 gedrückt wird.

Letzter Beitrag vor 3 Jahren 8 Posts 1.639 Views
Farbe Button1 ändern, wenn Button2 gedrückt wird.

Hallo,
Ich habe über eine Liste mehrere Buttons mit code-behind erstellt.
Wie ich mit dem Click Handler die Hintergrundfarbe des eigenen Buttons ändern kann ist mir klar.
Was ich gerne machen würde ist, wenn ich z.B. rechts den FIVE Button klicke, dass dann der linke FIVE Button rot wird. Und umgekehrt genau so. Also beie FIVE-Buttons wären eigentlich ein Buttonpaar, was zusammengehört.

Da ich die Buttons ja nicht mit XAML gemacht habe, weiß ich jetzt nicht, wie ich den linken FIVE Button mit dem Click Handler des rechten FIVE Buttons ansprechen kann.

Ich kann den Buttons zwar den Namen, ClassID oder auch AutomationId vergeben, aber leider hab ich keinen blassen schimmer, nach was ich googeln bzw. wie ich dieses Problem lösen soll.

Ist sowas überhaupt möglich oder muss ich sowas auf andere Art lösen?

Vielen Dank.

Leider sagst Du absolut nichts zu Deiner Umgebung und eine Glaskugel habe ich leider nicht, daher rate ich mal, dass Du mit Xamarin arbeitest.
Bei Xamarin gestaltest Du die UI über die XAML und programmierst sehr ähnlich wie bei WPF - und in beiden Fällen löst man das über MVVM.

[Artikel] MVVM und DataBinding

Ansonsten schau Dir bitte [Hinweis] Wie poste ich richtig? an, wie man Beiträge schreibt, sodass einem auch geholfen werden kann 🙂

Tut mir leid, da hab ich wohl die wichtigsten Informationen vergessen, sorry 🙂
Also ich arbeite mit Visual Studio 2019 und Xamarin. Die Buttons möchte ich nicht über XAML erstellen, da ich eventuell später eigene Buttons in der App erstellen will. Somit schweben jetzt auf meiner Oberfläche 12 Buttons herum, da wo ich nur einen ansprechen kann... und zwar den, den ich angeklickt habe. Er liefert mir ja seine Werte beim klicken mit, wenn ich das richtig verstanden habe. Somit kann ich dann seine Größe, Farbe usw. beim Klickereignis nach belieben wechseln. Was mir allerdings ein Rätsel ist, wie ich bei einem Klickereignis auf die Werte eines anderen Buttons zugreifen kann. Hier ein Codeausschnitt, beim erklären bin ich leider nicht so gut...


public MainPage()
        {
            InitializeComponent();

            List<string> list_r = new List<string>();

            list_r.Add("ONE");
            list_r.Add("TWO");
            list_r.Add("THREE");
            list_r.Add("FOUR");
            list_r.Add("FIVE");
            list_r.Add("SIX");

            list_r.Sort();
           
            for (int i = 0; i < list_r.Count; i++)
            {
                Button button1 = new Button(); // Creating button1
                button1.AutomationId = "right";
                button1.Text = list_r[i];
                button1.Clicked += OnButtonClicked;
                myGrid_right.Children.Add(button1);// Button der rechten Spalte hinzufügen



                Button button2 = new Button(); // Creating button2
                button2.AutomationId = "left";
                button2.Text = list_r[i];
                button2.Clicked += OnButtonClicked;
                myGrid_left.Children.Add(button2);// Button der linken Spalte hinzufügen

            }
        }


        private async void OnButtonClicked(object sender, EventArgs e)
        {
            var clickedButton = (Button)sender;

            if (clickedButton.AutomationId == "right")
            {
                    //Wenn der rechte Button gedrückt wurde, ändere Farbe des linken Buttons (z.B. SIX) auf rot
                    await Task.Delay(100);
            }
            else if (clickedButton.AutomationId == "left")
            {
                    //Wenn der linke Button gedrückt wurde, ändere Farbe des rechten Buttons (z.B. SIX) auf rot
                    await Task.Delay(100);
            }
        }

Löst man dann sowas auch mit MVVM und DataBinding ?
Danke Dir

Die Buttons möchte ich nicht über XAML erstellen, da ich eventuell später eigene Buttons in der App erstellen will.

Xamarin (zumindest Xamarin.Forms) und WPF sind so entwickelt worden, dass der MVVM Pattern und Bindings verwendet werden soll.
Du kannst das alles selbst entwickeln, aber Du wirst dann sehr sehr viele Workarounds brauchen, die Du mit XAML und Bindings nicht bräuchtest.

Du kannst hervorragende eigene Buttons auch über XAML umsetzen.

Löst man dann sowas auch mit MVVM und DataBinding ?

Ja

Da ich die Buttons ja nicht mit XAML gemacht habe, weiß ich jetzt nicht, wie ich den linken FIVE Button mit dem Click Handler des rechten FIVE Buttons ansprechen kann.

In MVVM hättest Du dafür ein ViewModel, das Du entsprechend ansprechen kannst, zB einen Status setzen kannst.
Und die UI passt dann die Farbe anhand vom Status an.

Willst Du kein MVVM (was nicht so dolle wäre), dann musst Du die Buttons in ein Array setzen, das Du als Feld anlegst.
Dann kannst überall in Deiner Instanz aus von zugreifen.

Also wenn ich das jetzt richtig verstanden habe, dann erzeuge ich im Xaml z.B. 2 Buttons:


<Button x:Name="Button1_left" Text="ONE" Grid.Row="1" Grid.Column="0" Clicked="Button1_left_Clicked"/>
<Button x:Name="Button1_right" Text="ONE" Grid.Row="1" Grid.Column="1" Clicked="Button1_right_Clicked" />

und dann für jeden Button ein Klickereignis:


private void Button1_right_Clicked(object sender, EventArgs e)
        {
            Button1_left.BackgroundColor = Color.Red;
            Button1_right.BackgroundColor = Color.Gray;
        }

        private void Button1_left_Clicked(object sender, EventArgs e)
        {
            Button1_right.BackgroundColor = Color.Red;
            Button1_left.BackgroundColor = Color.Gray;
        }

Das funktioniert soweit schon mal. Irgendwann sollten es aber einmal 100 Buttons pro Spalte werden. Das sind dann insgesamt 200 Klickereignisse zum erstellen. Hast Du das so gemeint? Oder bin ich da wieder auf dem Holzweg?

Les den Artikel, den ich verlinkt hab.
[Artikel] MVVM und DataBinding

In MVVM arbeitet man primär mit Commands und nicht Event Handlern (steht auch im Link).
Die Buttons können ruhig auf den gleichen Command verweisen und Du setzt dann das Mapping dynamisch um, statt 200 Eventhandler in ne Klasse zu klatschen.
Würde man ja mit Event Handlern auch nicht so machen.

Vielen Dank, dann werde ich mir das mal durchlesen. Somit ist mein zu lösendes Problem doch größer, als ich dachte... Ich hoffe, ich kann dann herausfinden, was der richtige Weg zu meinem Ziel ist.

Dass es jetzt etwas mehr wird liegt daran, dass Du etwas aufs falsche Pferd gesetzt hast und dadurch jetzt halt korrigieren musst, sodass Du dem Konzept entsprichst.
Kannst das auch über den Field-Ansatz machen; wirst dann halt andere Probleme haben/bekommen.