首页 > 解决方案 > 检测 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,但我希望将代码写在一个单独的类中

标签: c#wpf

解决方案


上面的代码不会创建任何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# 编程指南)


推荐阅读