Files
DMS/DMS.WPF/Helper/ThemeHelper.cs

124 lines
4.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Linq;
using System.Windows;
using iNKORE.UI.WPF.Modern; // 导入 iNKORE UI 库用于现代WPF控件和主题
using Microsoft.Win32; // 导入用于访问Windows注册表的类
namespace DMS.WPF.Helper;
/// <summary>
/// 主题管理帮助类,用于应用和初始化应用程序的主题。
/// </summary>
public static class ThemeHelper
{
/// <summary>
/// 应用指定的主题。
/// </summary>
/// <param name="themeName">要应用的主题名称("跟随系统", "浅色", "深色")。</param>
public static void ApplyTheme(string themeName)
{
ApplicationTheme theme; // 定义一个变量来存储最终的主题
// 判断是否设置为"跟随系统"
if (themeName == "跟随系统")
{
// 如果是,则根据当前系统主题设置应用主题
theme = IsSystemInDarkTheme() ? ApplicationTheme.Dark : ApplicationTheme.Light;
}
else
{
// 否则,根据传入的主题名称进行匹配
theme = themeName switch
{
"浅色" => ApplicationTheme.Light, // 设置为浅色主题
"深色" => ApplicationTheme.Dark, // 设置为深色主题
_ => IsSystemInDarkTheme() ? ApplicationTheme.Dark : ApplicationTheme.Light // 默认情况,跟随系统
};
}
// 为 iNKORE 控件应用主题
ThemeManager.Current.ApplicationTheme = theme;
// 为 HandyControl 控件应用主题
UpdateHandyControlTheme(theme);
}
/// <summary>
/// 初始化主题,在应用启动时调用。
/// </summary>
public static void InitializeTheme()
{
// 从应用设置中读取保存的主题并应用
// ApplyTheme(App.Current.Settings.Theme);
//
// // 监听系统主题变化事件
// SystemEvents.UserPreferenceChanged += (s, e) =>
// {
// // 当用户偏好设置中的"常规"类别发生变化,并且应用主题设置为"跟随系统"时
// if (e.Category == UserPreferenceCategory.General && App.Current.Settings.Theme == "跟随系统")
// {
// // 在UI线程上调用ApplyTheme来更新主题以响应系统主题的变化
// App.Current.Dispatcher.Invoke(() => { ApplyTheme("跟随系统"); });
// }
// };
}
/// <summary>
/// 更新 HandyControl 库的主题。
/// </summary>
/// <param name="theme">要应用的主题 (浅色或深色)。</param>
private static void UpdateHandyControlTheme(ApplicationTheme theme)
{
// 获取当前应用的资源字典集合
var dictionaries = App.Current.Resources.MergedDictionaries;
// 查找并移除现有的 HandyControl 皮肤资源字典
var existingSkin = dictionaries.FirstOrDefault(d =>
d.Source != null && d.Source.OriginalString.Contains("HandyControl;component/Themes/Skin"));
if (existingSkin != null)
{
dictionaries.Remove(existingSkin);
}
// 根据主题确定新的皮肤资源URI
string skinUri = theme == ApplicationTheme.Dark
? "pack://application:,,,/HandyControl;component/Themes/SkinDark.xaml" // 深色主题皮肤
: "pack://application:,,,/HandyControl;component/Themes/SkinDefault.xaml"; // 浅色主题皮肤
// 添加新的皮肤资源字典
dictionaries.Add(new ResourceDictionary { Source = new Uri(skinUri, UriKind.Absolute) });
// 为了强制刷新动态资源,先移除再重新添加主主题字典
var existingTheme = dictionaries.FirstOrDefault(d => d.Source != null && d.Source.OriginalString.Contains("HandyControl;component/Themes/Theme.xaml"));
if (existingTheme != null)
{
dictionaries.Remove(existingTheme);
dictionaries.Add(existingTheme);
}
}
/// <summary>
/// 检查当前Windows系统是否处于深色模式。
/// </summary>
/// <returns>如果系统是深色模式,则返回 true否则返回 false。</returns>
private static bool IsSystemInDarkTheme()
{
try
{
// 定义注册表项路径和值名称
const string keyName = @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize";
const string valueName = "AppsUseLightTheme";
// 读取注册表值1表示浅色模式0表示深色模式
var value = Registry.GetValue(keyName, valueName, 1);
// 如果值为0则系统为深色模式
return value is 0;
}
catch
{
// 如果访问注册表失败,则默认返回浅色主题
return false;
}
}
}