我有一个基本的Winform应用程序(.Net 4.6(,其中主Form仅由一个对接面板组成。表单充当屏幕管理器,并将通过在面板中添加/删除自定义UserControls来更改屏幕。
简单地说,我在处理屏幕上有一个按钮,如果你点击它,就会触发一个简单的回调:
private void langButton_Click(object sender, EventArgs e)
{
ActionCallback?.Invoke(UserAction.BackToTitle);
}
这将调用主形式中的方法,并最终调用:
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en");
现在我已经检查了CurrentUICulture是否按预期更改,但一旦它返回到调用行之后的UserControl,CurrentUICultures就会神奇地恢复到执行委托之前的状态!(没有其他代码更改区域性(
更令人困惑的是,我的标题屏幕的类似代码运行良好。它们都在UI线程上运行。
我一直在网上搜索,也尝试了很多方法,包括锁定正在改变文化的行,以防值被缓存或其他什么,但没有运气。
很明显,很多代码都被省略了,但这就是它的要点。我可以故意把文化性传回来,然后重新分配,但那太糟糕了。
有人能阐明这种行为,并可能提出一些解决方案吗?
编辑1:
我想我终于找到问题了。回调是这样的:
private async void HandleUserAction(UserAction action)
{
switch (action)
{
case UserAction.BackToTitle:
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en");
break;
//other cases omitted
}
}
我基本上做了一个快速测试,并将其提取到另一个匿名函数中,但没有async:
screen.ActionCallback2 += (a) => { System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en");};
它终于成功了!
我不确定它是否与下面的帖子重复,因为我已经在使用.Net 4.6或更高版本,但我还需要做更多的阅读。保持CurrentCulture异步/等待
我还不会回答我自己的问题,因为我仍在努力理解为什么会发生这种情况,如果其他人能解释这一点,请放心。
编辑2:
我发现这个问题可以用下面的代码复制
private async void button16_Click(object sender, EventArgs e)
{
//will revert back to previous value once it exits the function
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("jp");
}
private void button15_Click(object sender, EventArgs e)
{
//it will be changed to jp
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("jp");
Task.Run(() =>
{
this.Invoke((MethodInvoker)delegate
{
//this will be changed back to jp after exiting the thread, even though its same UI thread
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en");
});
});
}
最后,我通过将其添加到app.config 中来修复它
<AppContextSwitchOverrides value="Switch.System.Globalization.NoAsyncCurrentCulture=true" />
尽管这对我来说仍然有点奇怪,尤其是当功能按钮15_Click不涉及异步时。