.NET文化变革事件?

时间:2009-03-16 23:18:54

标签: .net culture

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

我有什么事情可以加入吗?或者我每次画画时都要测试文化设置,看它是否已经改变了?

2 个答案:

答案 0 :(得分:3)

您可以处理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
    }
};

Windows还会向所有表单广播WM_SETTINGSCHANGE message。您可以尝试通过覆盖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);
}

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

  

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

答案 1 :(得分:0)

我怀疑你可以通过让代码通过本身做类似事件的中心属性来改变文化来做到这一点;但要非常小心:静态事件是一种非常简单的方法,可以将疯狂的数量的对象留在内存中(即GC将它们视为活着的)。如果您采用这种方法,您可能希望查看WeakReference ...

之类的内容