Laden...

Button anders einfärben und Farbe nach dem Aktualisieren beibehalten.

Erstellt von Henri vor 4 Jahren Letzter Beitrag vor 4 Jahren 3.326 Views
H
Henri Themenstarter:in
55 Beiträge seit 2016
vor 4 Jahren
Button anders einfärben und Farbe nach dem Aktualisieren beibehalten.

Hallo Leute,

ich habe ein sehr einfach code für ein Button geschrieben, dies sollte die Farbe mein Button ändern, wenn man das Button geklickt hat.


void Bestellfreigabe_Click(object sender, RoutedEventArgs e)
	{
	        Button btn = new Button();
	
            btn = (Button)sender;
            btn.Background = System.Windows.Media.Brushes.Green;
        }


Es funktioniert aber wenn ich die Seite aktualisiert, bekommt das button wieder sein ursprüngliche Farbe, gibt es eine Möglichkeit es zu schaffen? So dass wenn die Seite aktualisiert wird sollte das Button nicht seine ursprüngliche Farbe wieder bekommen?

Danke für Ihre Hilfe

1.029 Beiträge seit 2010
vor 4 Jahren

Hi,

mir ist leider nicht klar, was du mit "Seite aktualisieren" exakt meinst.

Was auch immer du tust - müsste sich jedenfalls die letzte Farbe des Buttons irgendwo merken...

LG

2.078 Beiträge seit 2012
vor 4 Jahren

Außer der Button wird neu erzeug, dann bekommt er natürlich den Status vor der Farb-Änderung.

Bei WPF passiert das schnell, da es größtenteils selber organisiert, was wann neu geladen wird.
Daher sollt man auch keinen Status in der View halten, sondern im ViewModel und dann den Button an das ViewModel binden.

Sprich:
Beim Button-Click wird im ViewModel eine Property (z.B. IsEnabled) gesetzt und der Button bindet an diese Property mit einem Converter, der dann je Wert (true oder false) eine andere Farbe zurück gibt.

Stichwort: MVVM oder DataBinding

H
Henri Themenstarter:in
55 Beiträge seit 2016
vor 4 Jahren

Hi Taipi88,
Sieh mal bitte das Bild.
Nehmen wir an, ich habe gerade Test-BIA-06.10.2015 auf dem Button geklickt und ist das Button Grün geworden, wenn ich wechsle und gehe auf z.B. Test mit Ordnervorlage und wieder zurück auf Test-BIA-06.10.2015 die Farbe mein Button ändern sich und bekomme wieder seine Urspüngliche Farbe, in dem Sinn meine ich.

1.040 Beiträge seit 2007
vor 4 Jahren

Entweder der Button wird neu erzeugt oder die Farbe wird bei Auswahl eines Button nochmal gesetzt.

5.657 Beiträge seit 2006
vor 4 Jahren

Für genau diese Aufgabe gibt es in WPF Trigger. Siehe dazu [Artikel] MVVM und DataBinding, Abschnitt 4. "Styles und Trigger"

Weeks of programming can save you hours of planning

1.029 Beiträge seit 2010
vor 4 Jahren

Hallo Henri,

das erschließt sich mir leider immer noch nicht, da ich nicht wirklich weiß was bei einem Click auf den Ordner wirklich passiert.

Wie p!lle bereits anmerkt - irgendwo erzeugst du scheinbar neue Buttons in dieser Baumstruktur?. Dass die nicht von alleine die "richtige" Farbe haben ist ja logisch.

Grundlegend:
a) Sieht es nicht so aus, als wenn die Erzeugung neuer Buttons in der Baumstruktur überhaupt erforderlich wäre (obwohl das nur eine Vermutung ist)
b) Palladin007 hat eigentlich bereits den korrekten Weg beschrieben
(Hatte mir deinen Code nicht genau angesehen - wenn du schon mit WPF arbeitest - dann mit MVVM - wie von MrSparkle verlinkt - andernfalls kann ich dir nur empfehlen bei Windows Forms zu bleiben - da ist der Code den du hier hast auch so vom Framework mehr oder minder gedacht)

LG

H
Henri Themenstarter:in
55 Beiträge seit 2016
vor 4 Jahren

Hallo Taipi,

sorry dass ich mich erst melde.

also Baumstruktur, ja aber nicht wie einige sich vorstellen, ich glaube sollte auch keine stören.

Wir befinden uns in einem System, in diesem System könnten Änderungen vorgenommen werden

In diesem system hat man diese Baustruktur(Ordnerstruktur), wenn man auf einem Ordner klickt dann

kann der Benutzer sein Inhalt sehen, es wurde wie ein Webseite entwickeln, dh hat man Design, C#

und XAML, dort könnte die Anderungen direct gemacht werden, je nachdem wie man sich in C# und

XAML fit fühlen.

so sieht mein XAML aus


<Controls0:IndexMaskValueSetComboBox Header="Button" HeaderSharedSizeGroup="ProjektGroup2" ValueSet="Button" Margin="0,0,3,4" VerticalContentAlignment="Stretch">
                  <Controls0:IndexMaskValueSetComboBox.DataBinding>
                    <Controls1:ALDataBinding PropertyName="Button" />
                  </Controls0:IndexMaskValueSetComboBox.DataBinding>
                </Controls0:IndexMaskValueSetComboBox>

H
Henri Themenstarter:in
55 Beiträge seit 2016
vor 4 Jahren

Hallo P!lle
ich eine Frage oder wie solle ich es verstehen?

die Farbe sollte bei Auswahl eines Button nochmal gesetzt

1.040 Beiträge seit 2007
vor 4 Jahren

Erkläre uns mal bitte, was du mit "Aktualisierung der Seite" meinst.

H
Henri Themenstarter:in
55 Beiträge seit 2016
vor 4 Jahren

Hallo Leute

Unter aktualisieren wollte ich sagen , wenn man von einem Ordenr zu einem andere Ordner wechseln und dann wieder auf dem ersten zurückkehrt, bekommt das Button sein Ursprüngliche Farbe

Ich weiss es leider nicht, ob fremde Linke erlaubt sind unter findest du einen Link

https://vimeo.com/360522170

2.078 Beiträge seit 2012
vor 4 Jahren

Ich denke, es passiert folgendes:

  • Du setzt die Farbe im Code genau einmal, nämlich beim Klick.
  • Die klickst woanders hin und der Button verliert den Fokus (ganz wichtiger Punkt)
  • Der (vermutlich) Default-Style vom Button enthält einige Trigger, die beim LostFocus Event den Button bzw. die Farme wieder überschreibt.

... oder so ähnlich.

Aus dem Grund ist es selten eine gute Idee, einen Zustand sozusagen nur in der View zu halten - was Du effektiv aber tust: Du "speicherst" mit der Farbe eine Art "aktivierten" Zustand des Buttons.
Du solltest stattdessen irgendwo ein ViewModel mit einer Property "ButtonIsGreen" (bloß mit sinnvollem zum Kontext passenden Namen) haben und die Hintergrund-Farbe bindest Du dann mit einem Converter an diese Property:

<Button Background="{Binding ButtonIsGreen, Converter={myNamespace:GreenForTrueConverter}}" />
public class GreenForTrueConverter : MarkupExtension, IValueConverter
{
	public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
	{
		if (value is bool boolValue && boolValue)
			return Colors.Green;
		
		return Binding.DoNothing;
	}

	public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
	{
		return Binding.DoNothing;
	}
	
	public override object ProvideValue(IServiceProvider serviceProvider) => this;
}

PS:
Das ist im Browser geschrieben, keine Garantie, dass es auf Anhieb funktioniert, aber das Grundprinzip sollte laufen.

PPS:
Der Part mit der MarkupExtension (und die ProvideValue-Methode) sind nicht notwendig, aber ohne das müsste man den Converter in den Resources instanziieren und dann als StaticResource verwenden.
Ich habe mir daher den MarkupExtension-Weg wie oben gezeigt angewöhnt, da ich das sehr viel lesbarer finde.
Aus Performance-Sicht sollte man das aber lassen, da hier weit mehr Converter-Instanzen erzeugt werden, als notwendig sind. Ich muss aber auch sagen: Ich habe noch nie einen spürbaren Nachteil dadurch gehabt.

H
Henri Themenstarter:in
55 Beiträge seit 2016
vor 4 Jahren

Hallo Palladin007,

sorry dass ich mich erst jetzt melde, ich setzte deinen Vorschlag und gucke ob es klappt, dann gebe ich dir Bescheid

2.078 Beiträge seit 2012
vor 4 Jahren

Lies dir am Besten Mal die Kapitel zu WPF durch:

http://openbook.rheinwerk-verlag.de/visual_csharp_2012/1997_18_001.html#dodtp34972f67-6c1a-406f-a91d-ec8ff67058f9

Das geht auch auf MVVM mit WPF und einige andere Themen ein, die Du für meinen Vorschlag brauchst (DataBinding, ValueConverter, Commands), nur eigene MarkupExtensions sind nicht dabei.

Zu Beginn ist das mehr Arbeit, weil viel zu lesen, danach sparst Du aber eine Menge Zeit, die Du sonst hier oder mit der Recherche verbringen würdest.

H
Henri Themenstarter:in
55 Beiträge seit 2016
vor 4 Jahren

Wollte ich auch gerade sagen , die Umsetzung aheb ich leider nicht geschafft

2.078 Beiträge seit 2012
vor 4 Jahren

Du musst natürlich auch beim Click auf den Button nicht mit dem Click-Event arbeiten, sondern mit einem Command:

<Button Command="{Binding MakeButtonGreenCommand}" Background="{Binding ButtonIsGreen, Converter={myNamespace:GreenForTrueConverter}}" />
public class MyViewModel : INotifyPropertyChanged
{
    // Siehe Erklärungen zu INotifyPropertyChanged und passende Implementierungen dazu
    public bool ButtonIsGreen { get; set; }

    public ICommand MakeButtonGreenCommand { get; }

    public MyViewModel()
    {
        // Google-Suche nach "RelayCommand", gibt massig Anleitungen für eine Implementierung
        MakeButtonGreenCommand = new RelayCommand(() => ButtonIsGreen = true);
    }
}

Wenn Du kein ViewModel hast, dann solltest Du deine Anwendung bzw. das Design im allgemeinen Mal überdenken, WPF sollte man nie, nie, niemals ohne MVVM benutzen 😄 WPF ist für MVVM gebaut und umgekehrt MVVM für WPF, das beides gehört zusammen und nur zusammen macht auch die Arbeit mit WPF erst richtig Freude.
Man muss ja nicht je noch so strenge Regel noch so peinlich genau befolgen (wie z.B. dass jeder Command eine Klasse sein muss, dagegen verstößt z.B. das RelayCommand), aber wenigstens das Grundkonzept sollte man befolgen.

H
Henri Themenstarter:in
55 Beiträge seit 2016
vor 4 Jahren

@Palladin007,

ich habe mich die genze Zeit mit diese Sache gequält, leider nicht geschafft.
Also geht es hier um ein System, in dem man einige Sache anpassen könnte.
Hier geht es um eine zusätzliche Option für unsere System, was ich versuche
einzubauen.

2.078 Beiträge seit 2012
vor 4 Jahren

"leider nicht geschafft" heißt was?

H
Henri Themenstarter:in
55 Beiträge seit 2016
vor 4 Jahren

Sorry, dass ich erst jetzt antworte, damit wollte ich sagen, ich konnte deine Erklärung nicht umsetzen.
Wenn ich gut verstehen, gibt es keine Möglichkeit eine Button zu implementieren, so dass wenn man es klickt ändert die Farbe, egal ob die Seite aktuallisiert wird, bleibt die Farbe unverändern ?

1.040 Beiträge seit 2007
vor 4 Jahren

Henri, es ist leider nicht ganz so einfach dir zu folgen.

Kannst du nochmal genau beschreiben was du vor hast (was wir wahrscheinlich schon verstanden haben, Button färben) und vor allem was du mit "Seite aktualisieren" meinst?
Evtl. auch einfach auf französisch, damit der Sinn beim Übersetzen nicht verloren geht.

Evtl. ist auch [Tutorial] Vertrackte Fehler durch Vergleich von echtem Projekt mit minimalem Testprojekt finden hilfreich und du kannst deinen Code soweit abspecken, dass du den relevanten Teil zeigen kannst.

H
Henri Themenstarter:in
55 Beiträge seit 2016
vor 4 Jahren

Hallo P!lle,

schau dir bitte das Video an https://vimeo.com/360522170 , unter Aktualisierung meine ich wenn ich von einer Akte zu einer andere Akte wechsel.

1.040 Beiträge seit 2007
vor 4 Jahren

Aaaah. ⚠

Wie wird denn die rechte Seite generiert? Also das Layout bzw. die Daten. Wenn alle Elemente neu angelegt werden, ist der grüne Button natürlich weg.
Du musst dir für einen Auftrag merken, dass du bereits eine Bestellung ausgelöst hast und dann den Button entsprechend einfärben. Dazu gibt es bereits entsprechende Anleitungen.

2.078 Beiträge seit 2012
vor 4 Jahren

Bei WPF darfst Du nicht davon ausgehen, dass die Controls immer erhalten bleiben. Ist ein Control nicht mehr sichtbar, kann es sein, dass es verworfen wird und damit gehen natürlich auch alle Zustände verloren. Wird es wieder angezeigt, wird auch das Control neu erzeugt, aber wie oder wann genau WPF das macht, sollte dich gar nicht interessieren müssen. Man kann es je nach Aufbau zwar etwas steuern, aber nur sehr eingeschränkt und Du machst dir damit nur mehr Probleme, als nötig.

Wenn Du richtig gearbeitet hast, wird WPF aber immer das ViewModel bestehen lassen, wenn DU dir Daten merken willst, ist das ViewModel also der Ort, wo die hingehören.

Deshalb brauchst Du auch im ViewModel für jede einzelne Akte eine Property, in der Du dir merkst, dass eine Bestellung bereits ausgelöst wurde. Im Button-Command setzt Du die auf true und in der UI bindest Du daran um die Farbe entsprechend zu ändern.
Vermutlich möchtest Du dir das auch in einer Datenbank merken? Das wäre aus dem ViewModel heraus ganz einfach, da hast Du dann nichts mehr mit WPF zu tun - zumindest bei korrekter Umsetzung.

Mir stellt sich also immer noch die Frage:
Was heißt "ich konnte deine Erklärung nicht umsetzen"?
Was war das Problem beim Versuch, sie umzusetzen?

Wenn Du nicht erklärst, was Du nicht verstehst, können wir nur weiter herumraten und das wird früher oder später immer wieder bei ähnlichen Lösungen heraus kommen und hilft dir nicht weiter.