【问题标题】:Override CurrentCulture for WinForms control为 WinForms 控件覆盖 CurrentCulture
【发布时间】:2009-05-29 09:21:54
【问题描述】:

是否可以覆盖 WinForms 中特定控件的 CurrentCultureCurrentUICulture?所以这个特定控件使用不同的文化?

【问题讨论】:

  • 再次阅读你的问题我意识到我可能误解了你...我第一次阅读它好像你正在控制你想要拥有另一种文化,但现在我意识到你可能想要让现有的控件(如 Button)使用不同的文化进行操作...
  • 最后一点是正确的。我有一个现有的控件(无法访问源),我希望这个控件使用不同的文化

标签: winforms controls currentculture currentuiculture


【解决方案1】:

您可以通过实例化您选择的 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 的一部分中。

【讨论】:

    【解决方案2】:

    我不认为你可以为单一控制做到这一点,但对于当前线程你可以像这样切换:

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

    【讨论】:

    • 嗨,我知道如何为整个线程设置它,但这对我没有帮助,因为我需要更改它以对我的表单进行特殊控制。
    猜你喜欢
    • 2013-03-04
    • 2012-08-29
    • 1970-01-01
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多