2009-05-29 72 views
1

是否可以在WinForms中覆蓋CurrentCultureCurrentUICulture的特定控件?所以這個特定的控制使用不同的文化?覆寫WinForms控件的CurrentCulture

+0

重讀你的問題,我意識到,我可能誤會你......我首先閱讀它,就好像你正在製作一個你想擁有另一種文化的控件一樣,但是現在我意識到你可能想要有一個現有的控件(如Button)使用不同的文化行爲...... – 2009-05-29 10:03:47

+0

最後一件事是正確的。我有一個現有的控件(沒有訪問源),我希望這個控件使用不同的文化 – 2009-05-29 12:56:46

回答

2

您可以通過實例化您選擇的CultureInfo並將其作爲參數傳遞給格式化函數(如ToString)來實現。只是不要將它分配給Thread.CurrentThread.CurrentCulture或Thread.CurrentThread.CurrentUICulture,因爲這樣會改變應用程序的文化。

在您的代碼:

CultureInfo myCulture = CultureInfo.GetCultureInfo("en-US"); 
Console.WriteLine(DateTime.Now.ToString(myCulture)); 

如果你的代碼執行外部代碼,並要強制該代碼使用在內部選擇的文化,你可以做,通過創建一個新的線程,分配文化該線程然後讓該線程執行代碼。只要確保注意這種方法帶來的線程問題。

螺紋樣品:

string formattedDate = string.Empty; 
Thread t = new Thread(delegate() 
{ 
    // call external code without specifying culture 
    formattedDate = DateTime.Now.ToString(); 
    waitHandle.Set(); 
}); 
t.CurrentCulture = CultureInfo.GetCultureInfo("en-US"); 
t.Start(); 
waitHandle.WaitOne(); // wait for the thread to finish 
Console.WriteLine(formattedDate); 

作爲最後的點;我不知道爲什麼你想重寫CurrentCulture,但我建議你在做之前三思。用戶習慣於看到根據其區域設置格式化的數字;可能會引起混淆,特別是如果它僅發生在UI的一部分中。

0

我不認爲你可以爲單一控制做到這一點,但對於當前線程可以切換這樣的:

System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("DE");