我用一个按钮创建一个简单的窗口应用程序
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show(CultureInfo.CurrentCulture.NumberFormat.CurrencySymbol);
}
}
看起来CultureInfo.CurrentCulture在运行时不会改变。任何人都可以提供其他var来获取当前窗口货币格式
答案 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;
}
}
答案 2 :(得分:2)
每个帖子都设置了文化。应用程序启动时会创建主线程,因此在应用程序仍在运行时更改操作系统设置时,它不会更改。
来自CultureInfo class上的MSDN文档。
文化与主题
当一个新的应用程序线程启动时,它的当前文化和 当前的UI文化是由当前的系统文化定义的,而不是 通过当前的线程文化。以下示例说明了 区别。它设定了当前的文化和当前的UI文化 应用程序线程到法国(法国)文化(fr-FR)。如果 目前的文化已经是fr-FR,这个例子将它设置为英语 (美国)文化(en-US)。它显示三个随机数 货币值,然后创建一个新的线程,反过来, 显示三个随机数作为货币值。但是作为 示例中的输出显示,显示的货币值 新线程不反映法语的格式约定 (法国)文化,不像主应用程序线程的输出。