在.net5 WPF应用程序中设置区域性 [英] Setting Culture in .net5 WPF application
本文介绍了在.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
事件或ICommand
从MainWindow
开始一个方法,那么方法中的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屋!
查看全文