在 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;
}
如果我從MainWindowwithClick事件或 with ICommandthen開始一個方法,那么在方法Thread.CurrentThread.CurrentUICulture中將永遠是en-US,這很奇怪(有人可以解釋嗎?)。我可以再次設定為所需的,Culture但我必須在每個呼叫的方法中一一進行。有替代方案嗎?
在 .net4.7 中有一個解決方法,但它在 .net5 中不起作用。
uj5u.com熱心網友回復:
這種行為的原因是async方法的實作方式。async方法有自己特殊的執行背景關系。這個背景關系有它自己的CultureInfo,它是從呼叫該async方法的非異步背景關系繼承的。
在您的情況下,async背景關系的文化是從主執行緒繼承的,然后文化發生變化。
您可以做的是使用Dispatcher.InvokeAsync推遲 CultureInfo 配置來實施已經建議的解決方案。這樣,配置在async背景關系之外執行:
Dispatcher.InvokeAsync(() => CultureInfo.CurrentCulture = CultureInfo.GetCultureInfo("en-EN"));
由于這可能會擾亂您的初始化例程,因為在配置應用程式并顯示主視窗后,真正的背景關系將可用,您更喜歡不同的解決方案。
例如,您可以使用基于事件的初始化例程,首先運行低級應用程式配置,如文化配置,然后繼續進行涉及async背景關系中異步操作的其余初始化:
應用程式.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();
}
關鍵是將非異步配置與異步初始化分開。
uj5u.com熱心網友回復:
正如它在評論中正確指出的那樣,它可以在沒有 的情況下作業async,async您需要在應用程式的執行緒上進行。關鍵是,它CultureInfo.CurrentCulture設定了當前執行緒的值,因為它是一個執行緒池,你在async事件處理程式中看不到它,或者我想你偶爾可以擁有它,如果你會得到相同的執行緒。
protected async override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
await Application.Current.Dispatcher.BeginInvoke((Action)(() =>
{
var a = new CultureInfo(ConfigurationManager.AppSettings["Language"]);
Thread.CurrentThread.CurrentCulture = a;
Thread.CurrentThread.CurrentUICulture = a;
CultureInfo.DefaultThreadCurrentCulture = a;
CultureInfo.DefaultThreadCurrentUICulture = a;
CultureInfo.CurrentCulture = a;
}
));
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/376975.html
