百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

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

ccwgpt 2025-05-05 14:30 3 浏览 0 评论

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 预览包
1. 修改 ThemeType.cs
  • 新增 Default,用于标识自动跟随系统。
 public enum ThemeType
{
Default,
Light,
Dark,
}
2. 修改 Resources.cs
  • 新增 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;
}
  • ThemeDefault 跟随系统主题,并且当前操作系统是 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 void OnUserPreferenceChanged(object sender, UserPreferenceChangedEventArgs e)
{
if (e.Category == UserPreferenceCategory.General)
{
ApplyTheme();
}
}

bool IsDarkMode()
{
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;
}
}
void ApplyTheme()
{
var isDarkMode = IsDarkMode();
var theme = isDarkMode == true ? ThemeType.Dark : ThemeType.Light;
if(Theme != theme)
Theme = theme;
}
2. 修改 App.xaml
<Application
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">

<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/WPFDevelopers;component/Themes/Theme.xaml" />
<!-- 需要注意 wd:Resources 必须在Theme.xaml后 -->
<!--
默认情况下,Theme 会跟随系统主题(适用于 Windows 10 及以上版本),自动切换为 Light 或 Dark 模式。
若要手动设置为 Light 模式,可以使用 Theme="Light"。
你还可以自定义主题色,使用 Color="Fuchsia"(例如设置为 Fuchsia)
-->

<wd:Resources />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>

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

相关推荐

MFC、Qt、WPF?该用哪个?(mfc和wpf区别)

MFC、Qt和WPF都是流行的框架和工具,用于开发图形用户界面(GUI)应用程序。选择哪个框架取决于你的具体需求和偏好。MFC(MicrosoftFoundationClass)是微软提供的框架,...

一款WPF开发的通讯调试神器(支持Modbus RTU、MQTT调试)

我们致力于探索、分享和推荐最新的实用技术栈、开源项目、框架和实用工具。每天都有新鲜的开源资讯等待你的发现!项目介绍Wu.CommTool是一个基于C#、WPF、Prism、MaterialDesign...

关于面试资深C#、WPF开发工程师的面试流程和问题

一、开场(2-3分钟)1.欢迎应聘者,简单介绍公司和面试流程。2.询问应聘者是否对公司或岗位有初步的问题。二、项目经验与技术应用(10-20分钟)1.让应聘者详细介绍几个他参与过的C#、...

C# WPF MVVM模式Prism框架下事件发布与订阅

01—前言处理同模块不同窗体之间的通信和不同模块之间不同窗体的通信,Prism提供了一种事件机制,可以在应用程序中低耦合的模块之间进行通信,该机制基于事件聚合器服务,允许发布者和订阅者之间通过事件进行...

WPF 机械类组件动画制作流程简述(wps上怎么画机械结构简图)

WPF机械类组件动画制作流程简述独立观察员2025年3月4日一、创建组件创建组件用户控件,将组件的各部分“零件”(图片)拼装在一起,形成组件的默认状态:二、给运动部分加上Rend...

C#上位机WinForm和WPF选哪个?工控老油条的&quot;血泪史&quot;

作为一个从互联网卷进工控坑的"跨界难民",在这会摸鱼的时间咱就扯一下上位机开发选框架这档子破事。当年我抱着WPF的酷炫动画一头扎进车间,结果被产线老师傅一句"你这花里胡哨的玩意...

【一文扫盲】WPF、Winform、Electron有什么区别?

近年来,随着软件开发的不断发展,开发人员面临着选择适合他们项目的各种框架和工具的挑战。在桌面应用程序开发领域,WPF、Winform和Electron是三个备受关注的技术。本文将介绍这三者的区别,帮助...

一个开源、免费、强大且美观的WPF控件库

我们致力于探索、分享和推荐最新的实用技术栈、开源项目、框架和实用工具。每天都有新鲜的开源资讯等待你的发现!项目介绍HandyControl是一套基于WPF(WindowsPresentationF...

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

WPF根据系统主题自动切换浅色与深色模式控件名:Resources作者:WPFDevelopersOrg-驚鏵原文链接[1]:https://github.com/WPFDevelopers...

WPF与WinForm的本质区别(wpf与maui)

在Windows应用程序开发中,WinForm和WPF是两种主要的技术框架。它们各自有不同的设计理念、渲染机制和开发模式。本文将详细探讨WPF与WinForm的本质区别,并通过示例进行说明。渲染机制W...

Win10/Win11效率神器再进化:微软发布PowerToys 0.90.0版本

IT之家4月1日消息,微软今天(4月1日)更新PowerToys,在最新发布的0.90.0版本中,修复多个BUG之外,引入多项功能更新,为Windows10、Windows...

一款非常漂亮的WPF管理系统(wpf架构及特性)

我们致力于探索、分享和推荐最新的实用技术栈、开源项目、框架和实用工具。每天都有新鲜的开源资讯等待你的发现!WPFManager项目介绍该项目是一款WPF开发的管理系统,数据库采用的MSSqlserv...

WPF 实现描点导航(wpf按钮的点击事件)

WPF实现描点导航控件名:NavScrollPanel作者:WPFDevelopersOrg-驚鏵原文链接[1]:https://github.com/WPFDevelopersOrg/WPF...

微软更新基于Win11的Validation OS 2504:增强 .NET与WPF

IT之家5月1日消息,科技媒体NeoWin今天(5月1日)发布博文,报道称微软公司更新基于Windows11的ValidationOS,增强支持.NET和WPF,并优...

WPF的技术架构与优势(wpf的前景)

WindowsPresentationFoundation(WPF)是一个现代化的用户界面框架,专为构建Windows应用程序而设计。它通过分层的技术架构和丰富的功能集,提供了全面的应用程...

取消回复欢迎 发表评论: