摘要:新增IsWindows10OrLater方法用于检测当前操作系统是否是Win10或者更高版本。先使用注册表来获得Windows版本。如果注册表获取失败,然后使用Environment.OSVersion属性来获取操作系统的版本。
WPF 根据系统主题自动切换浅色与深色模式
控件名:Resources
作 者:WPFDevelopersOrg - 驚鏵
原文链接[1]
:https://github.com/WPFDevelopersOrg/WPFDevelopers码云链接[2]
:https://Gitee.com/WPFDevelopersOrg/WPFDevelopers框架支持.NET4 至 .NET8;
Visual Studio 2022;
最新 WPFDevelopers 1.1.0.3-preview4的Nuget新增 Default,用于标识自动跟随系统。
public enum ThemeType{
Default,
Light,
Dark,
}
新增 IsWindows10OrLater方法用于检测当前操作系统是否是Win10或者更高版本。
先使用注册表来获得Windows版本。如果注册表获取失败,然后使用Environment.OSVersion属性来获取操作系统的版本。
bool IsWindows10OrLater{
using (RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion"))
{
object value = key?.GetValue("CurrentMajorVersionNumber");
if (value != && int.TryParse(value.ToString, out int majorVersion))
{
return majorVersion >=10;
}
}
Version version = Environment.OSVersion.Version;
return version.Major >=10;
}
Theme为Default跟随系统主题,并且当前操作系统是Win10或更高版本时注册SystemEvents.UserPreferenceChanged事件并监听e.Category == UserPreferenceCategory.General时调用IsDarkMode方法用于判断操作系统是否为暗黑模式。
系统切换主题模式的时候则会触发 UserPreferenceChanged事件。
if (Theme == ThemeType.Default && IsWindows10OrLater){
SystemEvents.UserPreferenceChanged += OnUserPreferenceChanged;
ApplyTheme;
return;
}
if(Theme == ThemeType.Default)
Theme = ThemeType.Light;
private voidOnUserPreferenceChanged(object sender, UserPreferenceChangedEventArgs e)
{
if (e.Category == UserPreferenceCategory.General)
{
ApplyTheme;
}
}
boolIsDarkMode
{
conststring registryKey = @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize";
conststring registryValue = "AppsUseLightTheme";
try
{
varvalue = (int)Registry.GetValue(registryKey, registryValue,1);
returnvalue ==0;
}
catch
{
returnfalse;
}
}
voidApplyTheme
{
var isDarkMode = IsDarkMode;
var theme = isDarkMode ==true? ThemeType.Dark : ThemeType.Light;
if(Theme != theme)
Theme = theme;
}
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:avalonedit="http://icsharpcode.net/sharpdevelop/avalonedit"
xmlns:wd="https://GitHub.com/WPFDevelopersOrg/WPFDevelopers"
ShutdownMode="OnMainWindowClose"
StartupUri="MainWindow.xaml">
Source="pack://application:,,,/WPFDevelopers;component/Themes/Theme.xaml" />
GitHub 源码地址[3]
Gitee 源码地址[4]
[1]
https://github.com/WPFDevelopersOrg/WPFDevelopers[2]
https://gitee.com/WPFDevelopersOrg/WPFDevelopers[3]
GitHub 源码地址:
https://github.com/WPFDevelopersOrg/WPFDevelopers/tree/dev/src/WPFDevelopers.Samples.Shared/Resources.cs[4]
Gitee 源码地址:
https://gitee.com/WPFDevelopersOrg/WPFDevelopers/tree/dev/src/WPFDevelopers.Samples.Shared/Resources.cs来源:opendotnet