![](/img/trans.png)
[英]How to force WPF Toolkit DatePicker to refresh in UI after culture change?
[英]WPF - Change UI culture in callback of asynchrone task
在我的應用程序中,用戶可以切換語言。 在應用更改之前,會進行檢查。 完全同步這項工作很好。
現在,檢查是異步的,並且是 UI 線程集CultureInfo.CurrentUICulture
上的回調。 但是在回調結束時, CultureInfo.CurrentUICulture
是回滾的。 請參閱此示例:
主窗口.xaml :
<StackPanel>
<ComboBox SelectionChanged="ComboBox_Selected">
<ComboBoxItem>en-US</ComboBoxItem>
<ComboBoxItem>en-GB</ComboBoxItem>
<ComboBoxItem>fr-FR</ComboBoxItem>
</ComboBox>
<Button Click="Button_Click">Display</Button>
</StackPanel>
主窗口.xaml.cs:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void ComboBox_Selected(object sender, RoutedEventArgs e)
{
Debug.WriteLine($"A - {Thread.CurrentThread.ManagedThreadId} - {Thread.CurrentThread.IsBackground}");
var to = ((ComboBoxItem)((ComboBox)sender).SelectedItem).Content as string;
Task.Delay(TimeSpan.FromSeconds(1)).ContinueWith(
t => SetCurrentCulture(to),
TaskScheduler.FromCurrentSynchronizationContext()
);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show(CultureInfo.CurrentCulture.Name);
}
private static void SetCurrentCulture(string to)
{
Debug.WriteLine($"B - {Thread.CurrentThread.ManagedThreadId} - {Thread.CurrentThread.IsBackground}");
var culture = new CultureInfo(to);
CultureInfo.DefaultThreadCurrentCulture = culture;
CultureInfo.DefaultThreadCurrentUICulture = culture;
CultureInfo.CurrentCulture = culture;
CultureInfo.CurrentUICulture = culture;
}
}
你能解釋一下為什么嗎? 如何解決這個問題?
你能解釋一下為什么嗎?
從文檔:
對於面向 .NET Framework 4.6 或更高版本的應用程序,區域性是異步操作上下文的一部分。 換言之,從面向 .NET Framework 4.6 的應用開始,異步操作默認繼承啟動它們的線程的
CurrentCulture
和CurrentUICulture
屬性的值。
如何解決這個問題?
將以下開關添加到您的App.config
文件以切換回 .NET Framework 4.5.2 中的行為:
<runtime>
<AppContextSwitchOverrides value="Switch.System.Globalization.NoAsyncCurrentCulture=true" />
</runtime>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.