【问题标题】:Reload form after changing UICulture更改 UICulture 后重新加载表单
【发布时间】:2017-07-27 02:34:06
【问题描述】:

我正在开发一个窗体应用程序。

在我的主表单中,我有一个菜单项,单击该菜单项我需要更改整个表单的语言。

我正在将 UICulture 设置为新文化,但新语言仍未显示。

作为一种解决方法,我需要遍历该表单中的所有控件并应用新资源。我一点也不喜欢这个。

对于其他一些问题我不能做 Application.Restart();另外我的表单很重,所以我不想隐藏表单并创建一个新表单。

那么有没有其他方法可以重新加载我的表单?

【问题讨论】:

  • 你需要保持控件的状态吗?
  • 是的,我还需要保持状态。
  • 不,它不是重复的。我不想遍历控件。
  • 我自己不知道其他解决方案。重新加载的确切问题是什么?文化变化并不是一件经常发生的事情,因此即使用户界面因重新加载而出现轻微闪烁,用户也可以忍受。

标签: c# .net windows winforms


【解决方案1】:

也许它对你有用。

到点击事件或任何

this.Controls.Clear();
  InitializeComponent();

【讨论】:

  • 我无法格式化您答案中的代码,因为编辑太小无法提交,所以请自行正确格式化代码。
【解决方案2】:

因此,根据您想要做的事情,我认为您可以避免迭代整个表单组件集合的唯一方法是迭代特定于文化的资源并将它们应用于控件。这应该是一个较小的集合,因为只有表单上的控件子集具有需要更改的值。它看起来像这样:

var enumerator = mgr.GetResourceSet(Thread.CurrentThread.CurrentUICulture, true, true).GetEnumerator();

while (enumerator.MoveNext())
{
  var current = enumerator.Entry;
  var objName = current.Key.ToString().Split('.')[0];
  var item = this.GetType().GetField( objName, BindingFlags.NonPublic | BindingFlags.Instance );

  if (item != null)
  {
      mgr.ApplyResources(item.GetValue(this), objName);
  }
}

请注意,不是遍历表单控件集合,而是遍历资源文件中的键,使用反射来查找表单上的组件,并将资源仅应用于那些在文件中有设置的组件。

这只是一个示例,我认为它相当脆弱(即在表单上没有相应字段的嵌套 gridview 组件。资源文件中具有多个“.”级别的名称等)但它应该是足以让你开始,我希望!

【讨论】:

【解决方案3】:

我找到了另一种选择。

指示将控件添加到窗体的 Instid 我正在将所有控件添加到 userControl。所以我的主窗体只包含一个用户控件。

现在在更改语言时,我只需删除用户控件、处理它、创建一个新的用户控件并将其添加到表单中。

你们对这种方法有什么看法?

【讨论】:

  • 看起来你会失去控制的状态,你之前指出你需要维护。
猜你喜欢
  • 2022-01-19
  • 1970-01-01
  • 2012-03-21
  • 2020-10-03
  • 1970-01-01
  • 1970-01-01
  • 2016-01-24
  • 1970-01-01
相关资源
最近更新 更多