2013-08-30 21 views
2

亙古不變的變化,我創建一個簡單的窗口應用程序與CultureInfo.CurrentCulture在運行時

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

運行此第一:

CultureInfo.CurrentCulture.ClearCachedData();

然後做你的信息箱。

我只是好奇你爲什麼需要文化信息的實時更新?我認爲普通用戶會在Windows中設置一次,然後加載他們的應用程序。

+0

這對我的作品。感謝 – TrBaPhong

2

文化是針對每個線程設置的。主線程在應用程序啓動時創建,因此當應用程序仍在運行時更改操作系統設置時,它不會稍後再更改。

從MSDN文檔CultureInfo class

文化和線程

當一個新的應用程序線程啓動時,它目前的文化和 當前UI文化是由當前系統區域性由當前線程的文化定義,而不是 。以下示例說明了 的區別。它將當前的文化和當前UI文化設置爲法國(法國)文化(fr-FR)。如果 當前的文化已經是FR-FR,則該示例將其設置爲英文 (美國)文化(en-US)。它顯示三個隨機數作爲貨幣值,然後創建一個新線程,反過來, 顯示另外三個隨機數作爲貨幣值。但正如示例中的 輸出所示,與主應用程序線程的輸出不同, 新線程顯示的貨幣值不反映法國文化的法定格式約定。

+1

+1,瞭解有關多線程疑難解答的注意事項 – jdphenix

3

編輯:在程序退出前分離事件處理程序。我改變了代碼以反映這種必要性。請參閱documentationUserPreferenceChanged

你可以傾聽文化的變化。註冊到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; 
    } 
} 

CultureInfo Documentation

SystemEvents Documentation