myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Grundlagen von C# » Button anders einfärben und Farbe nach dem Aktualisieren beibehalten.
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

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

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Henri Henri ist männlich
myCSharp.de-Mitglied

Dabei seit: 15.12.2016
Beiträge: 53
Herkunft: Frankreich


Henri ist offline

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

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.

C#-Code:
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
16.09.2019 15:38 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Taipi88 Taipi88 ist männlich
myCSharp.de-Mitglied

avatar-3220.jpg


Dabei seit: 02.02.2010
Beiträge: 972
Entwicklungsumgebung: VS 2010
Herkunft: Mainz


Taipi88 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
16.09.2019 15:47 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Palladin007 Palladin007 ist männlich
myCSharp.de-Mitglied

Dabei seit: 03.02.2012
Beiträge: 1.199
Entwicklungsumgebung: Visual Studio 2017
Herkunft: NRW


Palladin007 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
16.09.2019 15:52 Beiträge des Benutzers | zu Buddylist hinzufügen
Henri Henri ist männlich
myCSharp.de-Mitglied

Dabei seit: 15.12.2016
Beiträge: 53
Herkunft: Frankreich

Themenstarter Thema begonnen von Henri

Henri ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Henri am 17.09.2019 14:29.

16.09.2019 16:04 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
p!lle
myCSharp.de-Mitglied

avatar-3556.jpg


Dabei seit: 22.02.2007
Beiträge: 998
Entwicklungsumgebung: Visual Studio (Community) 2017


p!lle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Entweder der Button wird neu erzeugt oder die Farbe wird bei Auswahl eines Button nochmal gesetzt.
16.09.2019 16:43 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
MrSparkle MrSparkle ist männlich
myCSharp.de-Team

avatar-2159.gif


Dabei seit: 16.05.2006
Beiträge: 5.199
Herkunft: Leipzig


MrSparkle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Für genau diese Aufgabe gibt es in WPF Trigger. Siehe dazu  [Artikel] MVVM und DataBinding, Abschnitt 4. "Styles und Trigger"
16.09.2019 18:32 Beiträge des Benutzers | zu Buddylist hinzufügen
Taipi88 Taipi88 ist männlich
myCSharp.de-Mitglied

avatar-3220.jpg


Dabei seit: 02.02.2010
Beiträge: 972
Entwicklungsumgebung: VS 2010
Herkunft: Mainz


Taipi88 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
17.09.2019 06:47 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Henri Henri ist männlich
myCSharp.de-Mitglied

Dabei seit: 15.12.2016
Beiträge: 53
Herkunft: Frankreich

Themenstarter Thema begonnen von Henri

Henri ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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

XML-Code:
<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>

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Henri am 17.09.2019 08:04.

17.09.2019 08:01 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Henri Henri ist männlich
myCSharp.de-Mitglied

Dabei seit: 15.12.2016
Beiträge: 53
Herkunft: Frankreich

Themenstarter Thema begonnen von Henri

Henri ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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

die Farbe sollte bei Auswahl eines Button nochmal gesetzt
17.09.2019 10:54 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
p!lle
myCSharp.de-Mitglied

avatar-3556.jpg


Dabei seit: 22.02.2007
Beiträge: 998
Entwicklungsumgebung: Visual Studio (Community) 2017


p!lle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Erkläre uns mal bitte, was du mit "Aktualisierung der Seite" meinst.
17.09.2019 11:54 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Henri Henri ist männlich
myCSharp.de-Mitglied

Dabei seit: 15.12.2016
Beiträge: 53
Herkunft: Frankreich

Themenstarter Thema begonnen von Henri

Henri ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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

Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von Henri am 17.09.2019 14:29.

17.09.2019 13:34 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Palladin007 Palladin007 ist männlich
myCSharp.de-Mitglied

Dabei seit: 03.02.2012
Beiträge: 1.199
Entwicklungsumgebung: Visual Studio 2017
Herkunft: NRW


Palladin007 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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:

XML-Code:
<Button Background="{Binding ButtonIsGreen, Converter={myNamespace:GreenForTrueConverter}}" />

C#-Code:
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.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Palladin007 am 18.09.2019 01:39.

18.09.2019 01:36 Beiträge des Benutzers | zu Buddylist hinzufügen
Henri Henri ist männlich
myCSharp.de-Mitglied

Dabei seit: 15.12.2016
Beiträge: 53
Herkunft: Frankreich

Themenstarter Thema begonnen von Henri

Henri ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Palladin007,

sorry dass ich mich erst jetzt melde, ich setzte deinen Vorschlag und gucke ob es klappt, dann gebe ich dir Bescheid
18.09.2019 07:18 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Palladin007 Palladin007 ist männlich
myCSharp.de-Mitglied

Dabei seit: 03.02.2012
Beiträge: 1.199
Entwicklungsumgebung: Visual Studio 2017
Herkunft: NRW


Palladin007 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Lies dir am Besten Mal die Kapitel zu WPF durch:

 http://openbook.rheinwerk-verlag.de/visu...1d-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.
18.09.2019 09:43 Beiträge des Benutzers | zu Buddylist hinzufügen
Henri Henri ist männlich
myCSharp.de-Mitglied

Dabei seit: 15.12.2016
Beiträge: 53
Herkunft: Frankreich

Themenstarter Thema begonnen von Henri

Henri ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Wollte ich auch gerade sagen , die Umsetzung aheb ich leider nicht geschafft
18.09.2019 09:48 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Palladin007 Palladin007 ist männlich
myCSharp.de-Mitglied

Dabei seit: 03.02.2012
Beiträge: 1.199
Entwicklungsumgebung: Visual Studio 2017
Herkunft: NRW


Palladin007 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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

XML-Code:
<Button Command="{Binding MakeButtonGreenCommand}" Background="{Binding ButtonIsGreen, Converter={myNamespace:GreenForTrueConverter}}" />

C#-Code:
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 :D 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.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Palladin007 am 18.09.2019 13:51.

18.09.2019 13:50 Beiträge des Benutzers | zu Buddylist hinzufügen
Henri Henri ist männlich
myCSharp.de-Mitglied

Dabei seit: 15.12.2016
Beiträge: 53
Herkunft: Frankreich

Themenstarter Thema begonnen von Henri

Henri ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@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.
09.10.2019 08:40 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Palladin007 Palladin007 ist männlich
myCSharp.de-Mitglied

Dabei seit: 03.02.2012
Beiträge: 1.199
Entwicklungsumgebung: Visual Studio 2017
Herkunft: NRW


Palladin007 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

"leider nicht geschafft" heißt was?
09.10.2019 18:02 Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 15.10.2019 08:24