在.net5 WPF应用程序中设置区域性 [英] Setting Culture in .net5 WPF application

查看:12
本文介绍了在.net5 WPF应用程序中设置区域性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在WPF应用程序中,我尝试在OnStartup中设置区域性。

    protected override async void OnStartup(StartupEventArgs startupEventArgs)
    {
        base.OnStartup(startupEventArgs);
        var a = new CultureInfo(ConfigurationManager.AppSettings["Language"]);
        Thread.CurrentThread.CurrentCulture = a;
        Thread.CurrentThread.CurrentUICulture = a;            
        CultureInfo.DefaultThreadCurrentCulture = a
        CultureInfo.DefaultThreadCurrentUICulture = a;
        CultureInfo.CurrentCulture = a;
    }

如果我用Click事件或ICommandMainWindow开始一个方法,那么方法中的Thread.CurrentThread.CurrentUICulture总是en-US,这很奇怪(有人可以解释吗?)我可以再次设置所需的Culture,但我必须在每个调用的方法中逐个进行设置。有其他选择吗?

.net4.7中有workaround,但在.net5中不起作用。

推荐答案

此行为的原因是async方法的实现方式。async方法有自己的特殊执行上下文。此上下文有自己的CultureInfo,它是从调用async方法的非异步上下文继承而来的。
在您的情况下,async上下文的区域性是从主线程继承的,区域性更改之前。

您可以做的是使用Dispatcher.InvokeAsync实现已经建议的解决方案,以推迟CultureInfo配置。这样,配置就可以在async上下文:

之外执行
Dispatcher.InvokeAsync(() => CultureInfo.CurrentCulture = CultureInfo.GetCultureInfo("en-EN"));

这可能会扰乱您的初始化例程,因为在配置应用程序并显示主窗口后,实际上下文将可用,因此您可能会选择不同的解决方案。

例如,您可以使用基于事件的初始化例程,在该例程中,首先运行低级应用程序配置,如区域性配置,然后继续进行剩余的初始化,该初始化涉及async上下文中的异步操作:

App.xaml.cs

// Event may be defined on a different class
private event EventHandler ConfigurationCompleted;
private void OnConfigurationCompleted() => this.ConfigurationCompleted?.Invoke(this, EventArgs.Empty);

protected override void OnStartup(StartupEventArgs startupEventArgs)
{
  this.ConfigurationCompleted += ConfigureInAsyncContext;

  // Do "low-level" application configuration. Code may be executed in a different class context

  CultureInfo.CurrentCulture = CultureInfo.GetCultureInfo("en-EN");

  ...

  // Continue in async context
  OnConfigurationCompleted();
}
 
private async void ConfigureInAsyncContext(object sender, EventArgs e)
{
  // TODO::Execute async operations

  new MainWindow().Show();
} 

关键是要将非异步配置与异步初始化分开。

这篇关于在.net5 WPF应用程序中设置区域性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆