2

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

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

4

3 回答 3

4

首先运行这个:

CultureInfo.CurrentCulture.ClearCachedData();

然后做你的消息框。

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

于 2013-08-30T04:19:31.953 回答
3

编辑:在程序退出之前分离事件处理程序。我更改了代码以反映这种必要性。请参阅. _UserPreferenceChanged

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

文化信息文档

系统事件文档

于 2013-08-30T04:26:23.237 回答
2

文化是按线程设置的。主线程是在应用程序启动时创建的,因此当您在应用程序仍在运行时更改操作系统设置时,它不会更改。

来自CultureInfo 类的MSDN 文档。

文化与主题

当一个新的应用程序线程启动时,它的当前文化和当前 UI 文化由当前系统文化定义,而不是由当前线程文化定义。以下示例说明了差异。它将应用程序线程的当前文化和当前 UI 文化设置为法语(法国)文化 (fr-FR)。如果当前文化已经是 fr-FR,则该示例将其设置为英语(美国)文化 (en-US)。它将三个随机数显示为货币值,然后创建一个新线程,该线程又将另外三个随机数显示为货币值。但正如示例的输出所示,与主应用程序线程的输出不同,新线程显示的货币值不反映法语(法国)文化的格式约定。

于 2013-08-30T04:19:41.500 回答