如何在启动事件中的WPF中设置CultureInfo?

问题描述 投票:0回答:1

我有一个用于.NET 4.7.2的WPF应用程序,并希望基于命令行参数设置全局区域性。根据许多来源(例如hereofficial docs),使用CultureInfo.DefaultThreadCurrentCulture设置多线程应用程序中的区域性。在App的构造函数中确实可以使用。但是,在我需要的地方(即在Application_Startup事件中),它无法工作,在该事件中我可以评估命令行参数。为什么会这样,我该如何解决?

App.xaml:

<Application x:Class="WpfApp1.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfApp1"
             StartupUri="MainWindow.xaml"
             Startup="Application_Startup">

    <Application.Resources>

    </Application.Resources>
</Application>

App.xaml.cs:

namespace WpfApp1
{
    public partial class App : Application
    {
        public App()
        {
            Demo("en-EN");
        }

        // Stops working if Demo is called in Application_Startup instead of constructor
        /* private void Application_Startup(object sender, StartupEventArgs e)
           {
               // TODO Take culture code from StartupEventArgs
               Demo("en-EN");
           }
        */

        private static void Demo(string cultureCode)
        {
            WriteDate();
            SetCulture(cultureCode);
            Task.Factory.StartNew(WriteDate);
        }

        private static void SetCulture(string code)
        {
            var ci = new CultureInfo(code);
            CultureInfo.DefaultThreadCurrentCulture = ci;
            CultureInfo.DefaultThreadCurrentUICulture = ci;
        }

        static void WriteDate()
        {
            var threadId = Thread.CurrentThread.ManagedThreadId;
            var threadCulture = Thread.CurrentThread.CurrentCulture;
            System.Diagnostics.Debug.WriteLine($"Thread {threadId} with culture {threadCulture} => {DateTime.Now}");
        }
    }
}

我的系统文化是德语。使用构造函数时的输出符合预期:

Thread 1 with culture de-DE => 09.01.2020 16:13:20
Thread 3 with culture en-EN => 1/9/2020 4:13:20 PM

现在,当我将对Demo的调用移至Application_Startup事件时,输出为:

Thread 1 with culture de-DE => 09.01.2020 16:16:10
Thread 3 with culture de-DE => 09.01.2020 16:16:10

不尊重对CultureInfo.DefaultThreadCurrentCulture的调用!有趣的是,如果我将此调用更改为Thread.CurrentThread.CurrentCulture,则可以解决此问题。但是我想为所有线程设置区域性,而不仅仅是当前线程。

c# wpf globalization cultureinfo
1个回答
0
投票

很难回答是什么原因,但是查看线程窗口,我想是在触发事件Application_Startup之前创建了处理后台任务的线程池。您可以在App构造函数中看到1个线程,在启动事件中看到3个线程。其中最有可能用于处理任务。

我看到2种可能的解决方案:

1)在App构造函数中,您还可以使用Environment访问命令行参数,因此只需将逻辑保留在构造函数中:

Environment.GetCommandLineArgs()

2)为所有线程设置它-在Application_Startup中枚举它们,并为所有线程设置区域性using this stackoverflow answer

© www.soinside.com 2019 - 2024. All rights reserved.