.NET 文化变革事件?

Phi*_*ght 5 .net culture

我有一个 .NET 自定义控件,它以依赖于文化的方式显示信息。为了提高性能,我在控件内缓存了一些信息,而不是每次都生成它。我需要知道文化是否发生了变化,以便我可以适当地重新生成这些内部信息。

有什么我参与过的活动吗?或者我是否必须在每次绘画时测试文化设置,看看它是否发生了变化?

Gro*_*roo 7

您可以处理该SystemEvents.UserPreferenceChanged事件:

SystemEvents.UserPreferenceChanged += (sender, e) => 
{
    // Regional settings have changed
    if (e.Category == UserPreferenceCategory.Locale)
    {
        // .NET also caches culture settings, so clear them
        CultureInfo.CurrentCulture.ClearCachedData();

        // do some other stuff
    }
};
Run Code Online (Sandbox Code Playgroud)

Windows 还将WM_SETTINGSCHANGE消息广播到所有窗体。您可以尝试通过重写 WndProc 来检测它,因此它看起来像:

// inside a winforms Form
protected override void WndProc(ref Message m)
{
    const int WM_SETTINGCHANGE = 0x001A;

    if (m.Msg == WM_SETTINGCHANGE)
    {
        // .NET also caches culture settings, so clear them
        CultureInfo.CurrentCulture.ClearCachedData();

        // do some other stuff
    }

    base.WndProc(ref m);
}
Run Code Online (Sandbox Code Playgroud)

请注意,您可能还想调用CultureInfo.CurrentCulture.ClearCachedData()以使新创建的线程的区域性信息无效,但请记住,CurrentCulture现有线程不会更新,如 MSDN 上所述:

ClearCachedData方法不会刷新现有线程的属性中的信息Thread.CurrentCulture。但是,未来的线程将具有新的CultureInfo属性值。