c# - 检测 C# 中的 Windows 10 主题更改
问题描述
我想检测 Windows 10 主题并编写了以下代码:
public class Class1
{
public Class1()
{
SystemEvents.UserPreferenceChanged += SystemEvents_UserPreferenceChanged;
}
private void SystemEvents_UserPreferenceChanged(object sender, UserPreferenceChangedEventArgs e)
{
switch (e.Category)
{
case UserPreferenceCategory.General:
setTheme();
break;
}
}
private static bool ThemeIsLight()
{
RegistryKey registry =
Registry.CurrentUser.OpenSubKey(
@"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize");
return (int)registry.GetValue("SystemUsesLightTheme") == 1;
}
public static void setTheme()
{
var br = ThemeIsLight() ? Brushes.White : Brushes.Black;
MessageBox.Show(br.ToString());
}
}
用法:
public MainWindow()
{
InitializeComponent();
Class1.setTheme();
}
问题是代码仅在程序最初运行时才有效,而在更改 Windows 主题时代码不运行。如果我将所有代码都写在 中,效果很好MainWindow.cs
,但我希望将代码写在一个单独的类中
解决方案
上面的代码不会创建任何Class1
. 因此,UserPreferenceChanged
不会创建事件处理程序。
有必要创建Class1
. 例如:
public partial class MainWindow : Window
{
private Class1 DetectPreferenceChange = new Class1();
public MainWindow()
{
InitializeComponent();
}
...
}
或者,如果需要在不创建Class1
实例的情况下订阅事件,请执行以下操作:
将事件处理程序的签名更改为public static
:
public static void SystemEvents_UserPreferenceChanged(object sender, UserPreferenceChangedEventArgs e)
{
// ...
}
现在您可以直接订阅该事件:
public MainWindow()
{
InitializeComponent();
SystemEvents.UserPreferenceChanged += (s, e) => { Class1.SystemEvents_UserPreferenceChanged(s, e); };
}
由于类中的所有方法static
现在都可以省略类构造函数,并且可以将类声明为static
.
有关其他信息,请参阅如何订阅和取消订阅事件(C# 编程指南)
推荐阅读
- reactjs - 在反应中将 sass 样式转换为内联样式对象
- r - 删除多年范围内的所有日期
- java - 获取异常表间歇性地处于只读模式
- blazor - 如何在 blazor 中通过外部代码设置选择框值?
- node.js - 隐藏然后再次显示猫鼬模型值
- django - 如何将多个 json 对象发送到 django 模型序列化器
- powerbi - 通过映射字段钻取
- docker - 如何使用 VSCode 的 Java 调试器调试在 Docker 容器中运行的 Java 应用程序
- c# - chart.DrawToBitmap 空白
- reactjs - React:如何根据路线更改页脚组件的位置