C#响应Windows系统主题颜色变化

获取系统是否使用暗黑模式

private void GetThemeColor()
{
    RegistryKey key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize");
    if (key != null)
    {
        int theme = (int)key.GetValue("AppsUseLightTheme", -1);
        if (theme == 0) //暗黑模式
        {
            XGrid.Background = new SolidColorBrush(Color.FromRgb(0, 0, 0));
        }
        else if (theme == 1) //亮色模式
        {
            XGrid.Background = new SolidColorBrush(Color.FromRgb(255, 255, 255));
        }
        else //调用失败后兜底
        {
            XGrid.Background = new SolidColorBrush(Color.FromRgb(255, 0, 0));
        }
        key.Close();
    }
}

响应Windows系统主题颜色变化

//此代码适用于 WPF .NET Core 项目,通过使用 SystemParameters.StaticPropertyChanged 事件,
可以正确地捕获和响应系统主题颜色变化
SystemParameters.StaticPropertyChanged += SystemParameters_StaticPropertyChanged;
private void SystemParameters_StaticPropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName == nameof(SystemParameters.WindowGlassColor))
    {
        // 执行响应主题颜色变化的代码
        XGrid.Background = new SolidColorBrush(SystemParameters.WindowGlassColor);
    }
}
//以下代码适用于 WPF .NET Framework(而非 .NET Core 或 .NET 5 / 6)项目以及 WinForms 项目
SystemEvents.UserPreferenceChanged += SystemEvents_UserPreferenceChanged;
private void SystemEvents_UserPreferenceChanged(object sender, UserPreferenceChangedEventArgs e)
{
    if (e.Category == UserPreferenceCategory.Color)
    {
        // 执行响应主题颜色变化的代码
        XGrid.Background = new SolidColorBrush(SystemParameters.WindowGlassColor);
    }
}
//win32API
[System.Runtime.InteropServices.DllImport("dwmapi.dll", PreserveSig = false)]
public static extern void DwmGetColorizationColor(out int pcrColorization, out bool pfOpaqueBlend);

DwmGetColorizationColor(out int pcrColorization, out _);
var color = GetColor(pcrColorization);
var brush = new SolidColorBrush(color);
XGrid.Background = brush;

private static System.Windows.Media.Color GetColor(int argb) => new System.Windows.Media.Color()
{
    A = (byte)(argb >> 24),
    R = (byte)(argb >> 16),
    G = (byte)(argb >> 8),
    B = (byte)(argb)
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

离歌漠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值