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.
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