我们的应用程序允许用户更改他们运行它的文化,并且文化可能与底层操作系统文化不同。我发现这样做的唯一方法是为每个线程设置Thread.CurrentThread.CurrentCulture和Thread.CurrentThread.CurrentUICulture。
唯一的问题是我们必须为每个线程设置文化,每当我们创建一个新线程时我们都需要记住这样做。如果将线程设置为另一种文化,然后创建一个新线程,它将获得操作系统的文化,而不是创建它的线程。
我想找到一个更好的方法来做到这一点。我只能想到两件事,但我不知道是否有可能。
即使我需要PInvoke到Win32 API,也欢迎任何想法或帮助。提前谢谢。
编辑:我发现this question类似,但没有找到答案。
答案 0 :(得分:1)
可能不是确切的解决方案,但是如何创建一个负责创建线程的类呢?
class MyThreadFactory
{
public static Thread getThread()
{
Thread a = new Thread(..);
a.CurrentCulture = xxxx;
return a;
}
}
用法:
Thread newThread = MyThreadFactory.getThread();
答案 1 :(得分:1)
文化是Windows中特定于线程的概念,Windows中的线程实际上与进程或应用程序域无关。线程和拥有文化信息的OS(我知道)之间没有抽象级别,所以你必须在每个线程上设置它。
答案 2 :(得分:1)
.NET 4.5中的CultureInfo类添加了两个新属性来解决此问题,DefaultThreadCurrentCulture和DefaultThreadCurrentUICulture。
现在您可以设置这两个属性,并且所有新线程都将设置为默认区域而不是系统区域性。这些属性还将为没有明确设置其文化集的所有现有线程设置文化。
答案 3 :(得分:0)
刚刚添加到@Rob Prouse的回答。这是一个快速演示。
在App初始化中设置文化:
if(CultureInfo.CurrentCulture.NumberFormat.CurrencySymbol != "N$")
{
CultureInfo customCulture = CultureInfo.CreateSpecificCulture(CultureInfo.CurrentCulture.Name);
customCulture.NumberFormat.CurrencySymbol = "N$";
CultureInfo.DefaultThreadCurrentCulture = customCulture;
CultureInfo.DefaultThreadCurrentUICulture = customCulture;
}
在我的.ToString()上使用文化信息。
.ToString("C", CultureInfo.DefaultThreadCurrentCulture)