2009-05-29 96 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");