我正在开发一个 Windows 窗体应用程序。
在我的主表单中,我有一个菜单项,单击该菜单项我需要更改整个表单的语言。
我正在将 UICulture 设置为新文化,但新语言仍未显示。
作为一种解决方法,我需要遍历该表单中的所有控件并应用新资源。我一点也不喜欢这个。
对于其他一些问题,我不能做 Application.Restart(); 我的表格也很重,所以我不想隐藏表格并创建一个新表格。
那么有没有其他方法可以重新加载我的表单?
也许它会为你工作。
点击事件或任何
this.Controls.Clear();
InitializeComponent();
因此,根据您想要做的事情,我认为您可以避免迭代整个表单组件集合的唯一方法是迭代特定于文化的资源并将它们应用于控件。这应该是一个较小的集合,因为只有表单上的控件子集具有需要更改的值。它看起来像这样:
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 组件。在资源文件中具有多个“.”级别的名称等)但它应该足以获得你开始了,我希望!
我找到了另一种选择。
Instid 将控件添加到表单中,我将所有控件添加到 userControl。所以我的主窗体只包含一个用户控件。
现在,当更改语言时,我只需删除用户控件、处理它、创建一个新的用户控件并将其添加到表单中。
你们对这种方法有什么看法?