Skip to content

Commit

Permalink
Add UsingWindowsAppTheme #149
Browse files Browse the repository at this point in the history
  • Loading branch information
ghost1372 committed Mar 19, 2023
1 parent e7cd286 commit 1d3f71a
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ static ThemeManager()
internal Brush DefaultAccentColor;
private const string RegistryThemePath = @"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize";
private const string RegSysMode = "SystemUsesLightTheme";
private const string RegAppMode = "AppsUseLightTheme";
private ApplicationTheme _currenTheme;
private Brush _currentAccent;
private bool _usingSystemTheme;
Expand All @@ -66,7 +67,7 @@ public bool UsingSystemTheme
_usingSystemTheme = value;
if (value)
{
initSystemTheme();
initSystemTheme(true);
}
else
{
Expand All @@ -75,9 +76,29 @@ public bool UsingSystemTheme
}
}
}
private void initSystemTheme()
private bool _usingWindowsAppTheme;
public bool UsingWindowsAppTheme
{
_currenTheme = GetSystemTheme();
get => _usingWindowsAppTheme;
set
{
if (_usingWindowsAppTheme != value)
{
_usingWindowsAppTheme = value;
if (value)
{
initSystemTheme(false);
}
else
{
resetSystemTheme();
}
}
}
}
private void initSystemTheme(bool isSystemTheme)
{
_currenTheme = GetSystemTheme(isSystemTheme);
_currentAccent = GetAccentColorFromSystem();
AccentColor = _currentAccent;
ApplicationTheme = _currenTheme;
Expand All @@ -99,12 +120,21 @@ public class SystemTheme
/// Returns theme used for Windows
/// </summary>
/// <returns></returns>
public static ApplicationTheme GetSystemTheme()
public static ApplicationTheme GetSystemTheme(bool isSystemTheme)
{
using var key = Registry.CurrentUser.OpenSubKey(RegistryThemePath);
var themeValue = key?.GetValue(RegSysMode) as int?;
var systemThemeValue = key?.GetValue(RegSysMode) as int?;
var appThemeValue = key?.GetValue(RegAppMode) as int?;

if (isSystemTheme)
{
return systemThemeValue != 0 ? Themes.ApplicationTheme.Light : Themes.ApplicationTheme.Dark;
}
else
{
return appThemeValue != 0 ? Themes.ApplicationTheme.Light : Themes.ApplicationTheme.Dark;
}

return themeValue != 0 ? Themes.ApplicationTheme.Light : Themes.ApplicationTheme.Dark;
}

public Brush GetAccentColorFromSystem()
Expand Down Expand Up @@ -138,7 +168,20 @@ private void SystemEvents_UserPreferenceChanged(object sender, UserPreferenceCha
case UserPreferenceCategory.General:
DispatcherHelper.RunOnMainThread(() =>
{
var changedTheme = GetSystemTheme();
Themes.ApplicationTheme changedTheme;
if (UsingSystemTheme && !UsingWindowsAppTheme)
{
changedTheme = GetSystemTheme(true);
}
else if (UsingWindowsAppTheme && !UsingSystemTheme)
{
changedTheme = GetSystemTheme(false);
}
else
{
changedTheme = GetSystemTheme(true);
}
var changedAccent = GetAccentColorFromSystem();
if ((_currenTheme != changedTheme) || (_currentAccent != changedAccent))
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ public class ThemeResources : ResourceDictionaryEx, ISupportInitialize

private bool _canBeAccessedAcrossThreads;
private bool _usingSystemTheme;
private bool _usingWindowsAppTheme;

public ThemeResources()
{
Expand Down Expand Up @@ -114,6 +115,19 @@ public bool UsingSystemTheme
}
}

public bool UsingWindowsAppTheme
{
get => _usingWindowsAppTheme;
set
{
_usingWindowsAppTheme = value;
if (ThemeManager.Current.UsingWindowsAppTheme != value)
{
ThemeManager.Current.UsingWindowsAppTheme = value;
}
}
}

public event EventHandler<FunctionEventArgs<ThemeManager.SystemTheme>> SystemThemeChanged;
public virtual void OnSystemThemeChanged(ThemeManager.SystemTheme theme)
{
Expand Down

0 comments on commit 1d3f71a

Please sign in to comment.