You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在C# WPF中检测系统区域设置变更时获取新CultureInfo失败

问题分析与解决方案

你的代码核心问题有两个:

  1. 错误调用了实例方法Thread.CurrentThread.CurrentCulture.ClearCachedData(),这个方法仅清理当前CultureInfo实例的内部缓存,不会刷新系统层面的文化缓存,无法让后续获取的文化值同步系统最新设置。
  2. 新建线程默认继承进程级的CurrentCulture,这个值在应用启动时就已固定,不会随系统区域设置变更自动更新,即使清理了缓存,新线程仍会继承旧的进程默认值。

修正后的代码

SystemEvents.UserPreferenceChanged += (sender, e) =>
{
    if (e.Category == UserPreferenceCategory.Locale)
    {
        // 调用静态方法清理整个应用域的文化缓存,这是关键
        CultureInfo.ClearCachedData();

        var thread = new Thread(s => 
        {
            // 新线程内再次清理缓存确保生效
            CultureInfo.ClearCachedData();
            ((State)s).Result = Thread.CurrentThread.CurrentCulture;
        });

        var state = new State();
        thread.Start(state);
        thread.Join();

        // 现在能正确获取到最新的区域文化
        var culture = state.Result;
    }
};

private class State
{
    public CultureInfo Result { get; set; }
}

更简洁的实现(无需新建线程)

如果不需要验证新线程的文化,清理缓存后直接调用以下方法即可获取最新用户区域设置:

SystemEvents.UserPreferenceChanged += (sender, e) =>
{
    if (e.Category == UserPreferenceCategory.Locale)
    {
        CultureInfo.ClearCachedData();
        // .NET 5+ 直接用GetUserDefaultCultureInfo获取最新用户文化
        var newCulture = CultureInfo.GetUserDefaultCultureInfo();
        // 兼容旧版本可使用:
        // var newCulture = CultureInfo.GetCultureInfo(CultureInfo.GetUserDefaultLCID());
    }
};

额外说明

在WPF中,若需让UI控件的格式(如日期、数字显示)同步最新区域设置,除了清理文化缓存,还需手动更新UI线程的CurrentCulture和CurrentUICulture,并刷新相关绑定:

var newCulture = CultureInfo.GetUserDefaultCultureInfo();
Thread.CurrentThread.CurrentCulture = newCulture;
Thread.CurrentThread.CurrentUICulture = newCulture;
// 若使用MVVM,可触发绑定更新或重新设置控件的Language属性

内容的提问来源于stack exchange,提问作者James B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 21:56:07