更改UICulture后重新加载表单

时间:2013-07-24 19:17:34

标签: c# .net windows winforms

我正在开发一个Windows表单应用程序。

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

我正在将UICulture设置为新文化仍然没有显示新语言。

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

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

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

3 个答案:

答案 0 :(得分:1)

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

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组件在表单上没有相应的字段。资源文件中有多个“。”级别的名称等)但它应该是我希望足够让你入门!

答案 1 :(得分:0)

我找到了另一种选择。

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

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

你认为这个方法的人怎么样?

答案 2 :(得分:0)

也许它适合你。

点击事件或任何

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