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”,它还会显示“$”==>我的预期结果是“€”
CultureInfo.CurrentCulture似乎在运行时不会更改。是否有人可以向我提供其他var以获取当前窗口货币格式

请先运行以下命令:

CultureInfo.CurrentCulture.ClearCachedData()

然后做你的留言框


我只是好奇为什么你需要文化信息的实时更新?我认为一般用户会在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;
  }
}