我有一个 .NET 自定义控件,它以文化相关的方式显示信息。为了提高性能,我在控件中缓存了一些信息,而不是每次都生成它。我需要知道文化是否发生了变化,以便我可以适本地重新生成这些内部信息。
我有什么事件吗?还是我每次绘画时都必须测试文化设置以查看它是否发生了变化?
最佳答案
您可以处理 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 所述,现有线程将不会更新:The
ClearCachedData
method does not refresh the information in theThread.CurrentCulture
property for existing threads. However, future threads will have newCultureInfo
property values.
关于.NET 文化变革事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/652505/