WPF 根据系统主题自动切换浅色与深色模式

B站影视 欧美电影 2025-03-18 17:04 1

摘要:新增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-preview4Nuget

新增 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;
}
x:Class="WPFDevelopers.Samples.App"
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

相关推荐