Form1 Farbe ändern mit Checkbox in Form2?

2 Antworten

Nun, vermutlich ist es doch so, dass Form2 aus Form1 als Dialog angezeigt wird (sowas wie "Einstellungen")?

Dann gilt

  1. Die Einstellungen sollten permanent gespeichert werden
  2. Jede Maske sollte sich beim Öffnen anhand der Settings einstellen
  3. Form1 kann einfach nach Anzeige des Dialogs ein Update durchführen

Wie erreicht man 1.?

Man geht in die Projekteigenschaften (Doppelklick auf "Properties" in der Projektmappe). Dort in den Reiter "Settings". Dort legt man ein User-Setting (damit das pro User gespeichert wird) "DarkMode" vom Typ "Boolean" an. Standardwert vermutlich "false", wenn das Programm standardmäßig im LightMode starten soll.

Form2 aktualisiert beim Schließen diese Property mit folgendem Code:

Properties.Settings.Default.DarkMode = chkDarkMode.Checked;
Properties.Settings.Default.Save();

So. Das macht erstmal, dass das Programm immer weiß, ob DarkMode oder nicht.

Wie erreicht man 2.?

Man macht in jeder Form eine Methode "AdaptToDarkMode" beispielsweise, welche je nachdem ob der Darkmode aktiviert ist das UI entsprechend umstellt.

Code hierfür etwas wie:

private void AdjustToDarkMode()
{
  if (Properties.Settings.Default.DarkMode)
  {
    // Alles auf DarkMode
  }
  else
  {
    // Alles auf LightMode
  }
}

Diese Methode ruft man im FormLoad-Event des Formulars auf.

So. Damit aktualisiert sich beim Öffnen jedes Fenster erstmal entsprechend der vom Benutzer eingestellten Settings.

Wie erreicht man 3.?

Nun, Form2 wird ja vermutlich irgendwie so aufgerufen:

using (var frm2 = new Form2())
{
  if (frm2.ShowDialog(this) == DialogResult.OK)
  {
    ...
  }
}

Und dann ruft man eben in diesem Block AdjustToDarkMode einfach nochmal auf.

Palladin007  29.08.2021, 12:16

Ein besserer Name wäre "ApplyTheme".
Ist kürzer und gaukelt nicht vor, es wurde nur den DarkMode umsetzen, was sie ja nicht immer tut.

1
ohwehohach  29.08.2021, 12:16
@Palladin007

Ja, es ging mir ums Prinzip. Man könnte die Methode auch "ApplySettings" nennen und dann alle Einstellungen, die die Form gerne berücksichtigen möchte, entsprechend verarbeiten.

0
Palladin007  29.08.2021, 12:20
@ohwehohach

War auch nur als Ergänzung gemeint.

Und ja, ApplySettings wäre noch besser, vorausgesetzt, man teilt sie danach in ApplyTheme und Weitere auf.

Das würde ich dann aber sogar automatisch (per Event) machen lassen, da man das dann nicht mehr vergessen kann.

1

Google bringt sich garantiert weiter, dir fehlt nur das nötige Verständnis der Objektorientierung :P
Und das solltest Du ändern, so gut wie alle UI-Framework bauen sehr stark auf Objektorientierung auf, wenn Du das nicht verstanden hast, rennst Du nur gegen eine Wand nach der Anderen.

Um dein Ziel zu erreichen brauchst Du Kommunikation zwischen zwei Forms.

Allerdings ist WinForms auch nicht gerade angenehm, wenn es um solche Vorhaben geht und es steht schon seit langem auf dem Abstellgleiß, es lebt eigentlich nur noch wegen der großen Verbreitung.
Einfacher wäre WPF, was für solche Flexibilität entwickelt wurde und noch viele andere Vorteile bietet. WPF steht zwar auch auf dem Abstellgleiß, allerdings werden der Nachfolger namens MAUI und viele Andere auch zumindest indirekt nach den Konzepten der Vorlage WPF entwickelt. Wenn Du also in Zukunft aktuelle Technologien nutzen willst (was Du tun solltest), wirst Du es deutlich leichter haben, wenn Du jetzt mit WPF beginnst. Der Umstieg von WinForms ist sehr viel schwieriger.

Bei WPF wirst Du aber auch nicht um Objektorientierung herum kommen und auch hier brauchst Du sowas wie Forms (heißen Window) und Kommunikation zwischen, sie wird allerdings sehr viel einfacher, da Du dich nicht mehr selber darum kümmern musst, in jeder Form die neuen Farben zu aktualisieren, das macht WPF automatisch mit Bindings.
Um mit WPF effektiv arbeiten zu können, brauchst Du MVVM und DataBinding.

Woher ich das weiß:Berufserfahrung
ohwehohach  29.08.2021, 12:18

Prinzipiell stimme ich dem zu (auch wenn Forms meiner Meinung nach noch lange nicht auf dem Abstellgleis ist - es wird ja sogar in .NET Core unterstützt, aber eben wie WPF nicht plattformübergreifend), aber glaubst Du wirklich, jemand, der so eine fundamentale Frage hat, wird jetzt so spontan WPF Bindings (die ja schon für erfahrene .NET Programmierer zur Verzweiflung bringen) oder MVVM verstehen?

0
Palladin007  29.08.2021, 12:32
@ohwehohach
es wird ja sogar in .NET Core unterstützt

Weil Microsoft keine Wahl hat, die wollen es weg haben, können aber nicht, weil sonst zu viele Leute nicht zu .NET 5 kriegen würden und das alte .NET 4.x ist das größere Übel als WinForms.

Das meine ich mit "Abstellgleiß" - ganz zu schweigen davon, dass es nicht mehr weiterentwickelt wird.
Außerdem befürchte ich, dass es irgendwann von Windows nicht mehr unterstützt wird, sobald .NET 4.8 den LTS nicht mehr hat, das ist aber nur eine Vermutung für die ferne Zukunft.

..., aber glaubst Du wirklich, jemand, der so eine fundamentale Frage hat, wird jetzt so spontan WPF Bindings (die ja schon für erfahrene .NET Programmierer zur Verzweiflung bringen) oder MVVM verstehen?

Du hast Recht, das ist vielleicht etwas zu kurz formuliert.
Dennoch halte ich es für klüger, mit WPF anzufangen, die grundlegende Arbeit ist mit WPF ja nicht so furchtbar viel schwerer zu lernen als WinForms, man arbeitet nur anders. Aber natürlich sollte man grob die Grundlagen (was die Objektorientierung mit einschließt) verinnerlicht haben, das gilt aber auch für WinForms.

Direkt mit MVVM und DataBinding um die Ecke zu kommen, war also etwas zu kurz formuliert, doch nach einem grundlegenden Einstieg sollte das durchaus machbar sein. Dafür gibt es auch gute Bücher, z.B. Visual C# 2019, was ganz nebenbei noch die C#-Grundlagen vermittelt.

1