Tipp der Woche 05.05.2022, 12:46 Uhr

WPF/VB: Windows-Dark-Theme erkennen

Will der Anwender statt im üblichen Lightmode mit weißen Hintergründen lieber im Darkmode arbeiten, sollte eine App darauf reagieren können.
(Quelle: B. Lauer)
Aber wie erkennt eine App, ob der Anwender in seinem Windows-System den dunklen Modus eingestellt hat? Die Antwort: Ganz einfach, es steht in der Registry und die kann man ja auslesen. Wie das klappt hat David Rickard in diesem Blogbeitrag für C# ausgearbeitet. Er berücksichtigt dabei auch den Hohen-Kontrast-Modus und hat eine Routine verfasst, so dass ein Programm den Wechsel des Modus permanent überwachen kann. Hier finden Sie die Kernroutine GetWindowsTheme(), welche das in der Registry gespeicherte Thema (Light/Dark) ermittelt in Form von Visual-Basic-Code (getestet unter Windows 10).
...
Const RegistryKeyPath = "Software\Microsoft\Windows\CurrentVersion\Themes\Personalize"
Const RegistryValueName = "AppsUseLightTheme"

Private Enum WindowsTheme
  Light
  Dark
End Enum

Private Shared Function GetWindowsTheme() As WindowsTheme
  Using key As Microsoft.Win32.RegistryKey =
    Microsoft.Win32.Registry.CurrentUser.OpenSubKey(RegistryKeyPath)
    Dim registryValueObject As Object = key?.GetValue(RegistryValueName)
    If registryValueObject Is Nothing Then
      Return WindowsTheme.Light
    End If
    Dim registryValue As Integer = CInt(registryValueObject)
    Return If(registryValue > 0, WindowsTheme.Light, WindowsTheme.Dark)
  End Using
End Function
...
Mehr zur hier genutzten Klasse RegistryKey finden Sie hier. Die Funktion liefert entweder WindowsTheme.Light oder WindowsTheme.Dark zurück. Hier noch ein Beispiel, wie das Programm darauf reagieren könnte (tb ist dabei eine das Fenster ausfüllende WPF-Textbox):
Private Sub MainWindow_Loaded(...) Handles Me.Loaded
  Dim theme As String = GetWindowsTheme().ToString
  If theme = "Dark" Then
    tb.Background = Brushes.Black
    tb.Foreground = Brushes.NavajoWhite
    tb.FontSize = 32
    tb.FontWeight = FontWeights.UltraBold
    tb.Text = " D a r k m o d e !! "
  End If
End Sub


Das könnte Sie auch interessieren