代码之家  ›  专栏  ›  技术社区  ›  Martin Moser

重写WinForms控件的当前区域性

  •  1
  • Martin Moser  · 技术社区  · 16 年前

    是否可以覆盖 CurrentCulture 以及 CurrentUICulture 对于WinForms中的特定控件?所以这个特定的控件使用不同的文化?

    2 回复  |  直到 13 年前
        1
  •  2
  •   Fredrik Mörk    16 年前

    您可以通过实例化所选的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);
    

    最后一点,我不知道 为什么? 您想覆盖当前的文化,但我建议您在这样做之前三思而后行。用户习惯于看到日期和按照其区域设置格式的数字;更改这些日期可能会令人困惑,特别是当它只发生在UI的一个部分时。

        2
  •  0
  •   DevComponents - Denis Basaric    16 年前

    我不认为您可以对单个控件执行此操作,但对于当前线程,您可以这样切换:

    System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("DE");
    
    推荐文章