C# WPF für jeden Button ändere farbe?
in WinForms ist das einfach: (Ich habe das aus meinem Gedächtnis geschrieben. kann also sein das es falsch ist aber sowas in der art..)
foreach (Control c in this.Controls)
if (c is Button)
(Button)c.ForeColor = Color.Red;
WPF hat jedoch this.Controls nicht. Wie soll man das in WPF machen?
1 Antwort
Wenn du mit WPF arbeiten möchtest, würde ich dir empfehlen, dich erst einmal mit XAML und mit dem MVVM-Pattern auseinanderzusetzen. Beides ist notwendig, um die folgende Lösung verstehen und einsetzen zu können. Mit dem Windows Forms-Ansatz solltest du erst gar nicht beginnen.
Lernquellen für WPF und MVVM findest du hier:
- WPF (Dokumentation)
- WPF Apps with the MVVM pattern
- WPF / MVVM Quickstart Tutorial
- MVVM Pattern (mit Xamarin)
- CodeProject: WPF Quickstart (CodeProject ist generell eine gute Anlaufstelle für .NET-Tutorials / Beispielprojekte)
- WPF Tutorial.net
Zur Problemlösung: Für Buttons kann man eine Style Ressource anlegen und diese allen Buttons zuordnen. Ein DataTrigger kann sich dann an ein Property im ViewModel binden. Wenn sich dessen Wert ändert, ändert sich auch die Farbe der Buttons.
In diesem Beispiel würde allen Buttons im Fenster eine blaue Schriftfarbe zugewiesen werden und im Falle, dass ein Property ErrorOccured den Wert true hat, die Farbe rot.
<Window.Resources>
<Style TargetType="{x:Type Button}">
<Setter Property="Foreground" Value="Blue" />
<Style.Triggers>
<DataTrigger Binding="{Binding ErrorOccured}" Value="True">
<Setter Property="Foreground" Value="Red" />
</DataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
Im ViewModel hätte man das gebundene Property:
private bool _errorOccured;
public bool ErrorOccured
{
get => _errorOccured;
set
{
if (_errorOccured != value)
{
_errorOccured = value;
NotifyPropertyChanged(nameof(ErrorOccured));
}
}
}
Es muss das INotifyPropertyChanged-Interface implementieren sowie eine NotifyPropertyChanged-Methode:
private void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
- Von einem Zwang war nie die Rede. Ich werde trotzdem keine andere Lösung vorschlagen.
- Wenn jemand schon mit Windows Forms gearbeitet hat, stufe ich diese Person nicht mehr als Anfänger ein und Einstiegsmaterial zu WPF und MVVM habe ich kaum übersehbar aufgelistet. Anfängern würde ich generell die Arbeit mit WPF nicht empfehlen.
Lernquellen für WPF und MVVM findest du hier
Oder das kostenlose Buch Visual C# 2012, das geht auch auf WPF ein.
Oder der kostenpflichtige Nachfolger "Visual C# 2019", gibt's z.B. bei Amazon.
MVVM kann man machen, man muss es aber nicht zwingend verwenden. Einem offensichtlichen Anfänger so etwas als Einstieg vorzuschlagen finde ich etwas übertrieben.