CultureInfo.CurrentCulture在运行时不会更改

时间:2013-08-30 04:12:35

标签: c# cultureinfo

我用一个按钮创建一个简单的窗口应用程序

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来获取当前窗口货币格式

3 个答案:

答案 0 :(得分:4)

首先运行:

CultureInfo.CurrentCulture.ClearCachedData();

然后点击你的消息框。

我很好奇为什么你需要从文化信息中获得实时更新?我认为普通用户会在Windows中设置一次,并加载他们的应用程序。

答案 1 :(得分:3)

编辑:在程序退出之前分离事件处理程序。我改变了代码以反映这种必要性。查看UserPreferenceChanged的{​​{3}}。

你可以倾听文化的变化。注册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;
  }
}

documentation

CultureInfo Documentation

答案 2 :(得分:2)

每个帖子都设置了文化。应用程序启动时会创建主线程,因此在应用程序仍在运行时更改操作系统设置时,它不会更改。

来自CultureInfo class上的MSDN文档。

  

文化与主题

     

当一个新的应用程序线程启动时,它的当前文化和   当前的UI文化是由当前的系统文化定义的,而不是   通过当前的线程文化。以下示例说明了   区别。它设定了当前的文化和当前的UI文化   应用程序线程到法国(法国)文化(fr-FR)。如果   目前的文化已经是fr-FR,这个例子将它设置为英语   (美国)文化(en-US)。它显示三个随机数   货币值,然后创建一个新的线程,反过来,   显示三个随机数作为货币值。但是作为   示例中的输出显示,显示的货币值   新线程不反映法语的格式约定   (法国)文化,不像主应用程序线程的输出。