gpt4 book ai didi

c# - 检测 c# 中的 Windows 10 主题更改

转载 作者:行者123 更新时间:2023-12-04 08:20:32 25 4
gpt4 key购买 nike

我想检测 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 .
如需更多信息,请参阅 How to subscribe to and unsubscribe from events (C# Programming Guide)

关于c# - 检测 c# 中的 Windows 10 主题更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65517887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com