我有一个.NET自定义控件,它以文化相关的方式显示信息。为了提高性能,我将一些信息缓存在控件中,而不是每次都生成它。我需要知道文化是否已经改变,以便我可以适当地重新生成这些内部信息。
我有什么事情可以加入吗?或者我每次画画时都要测试文化设置,看它是否已经改变了?
答案 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
...