C# CultureInfo.CurrentCulture在运行时不会更改
我用一个按钮创建了一个简单的窗口应用程序C# CultureInfo.CurrentCulture在运行时不会更改,c#,cultureinfo,C#,Cultureinfo,我用一个按钮创建了一个简单的窗口应用程序 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { MessageBox.Show(CultureInfo.CurrentCulture.NumberFormat.C
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show(CultureInfo.CurrentCulture.NumberFormat.CurrencySymbol);
}
}
- 我第一次单击“按钮1”时,它显示“$”
- 我打开控制面板>区域和语言,将货币符号从“$”更改为“€”
- 再次单击“按钮1”,它还会显示“$”==>我的预期结果是“€”
我只是好奇为什么你需要文化信息的实时更新?我认为一般用户会在Windows中设置一次,然后加载他们的应用程序。文化是每个线程设置的。主线程是在应用程序启动时创建的,因此在应用程序仍在运行时更改操作系统设置时,主线程不会更改 从上的MSDN文档 文化与线程 启动新的应用程序线程时,其当前区域性和 当前UI区域性由当前系统区域性定义,而不是 通过当前线程区域性。下面的示例说明了 差别。它设置当前区域性和当前用户界面区域性 法国文化(fr)的应用程序线程。如果 当前文化已经是fr,示例将其设置为英语 (美国)文化(美国)。它将三个随机数显示为 货币值,然后创建一个新线程, 将另外三个随机数显示为货币值。但是作为 示例的输出显示 新线程不反映法语的格式约定 (法国)区域性,与主应用程序线程的输出不同
编辑:在程序退出之前分离事件处理程序。我修改了代码以反映这种必要性。有关
用户首选项更改的信息,请参见
你可以倾听文化的变化。注册到Microsoft.Win32.SystemEvents.UserPreferenceChanged
并执行所需操作
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
SystemEvents.UserPreferenceChanged += SystemEvents_UserPreferenceChanged;
}
void SystemEvents_UserPreferenceChanged(object sender, UserPreferenceChangedEventArgs e) {
if (e.Category == UserPreferenceCategory.Locale) {
CultureInfo.CurrentCulture.ClearCachedData();
}
}
private void button1_Click(object sender, EventArgs e) {
MessageBox.Show(CultureInfo.CurrentUICulture.NumberFormat.CurrencySymbol);
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e) {
SystemEvents.UserPreferenceChanged -= SystemEvents_UserPreferenceChanged;
}
}