我正在开发一个windows窗体应用程序。
在我的主窗体中,我有一个菜单项,单击该菜单项时,我需要更改整个窗体的语言。
我正在将UICulture设置为新的区域性,但新语言仍未显示。
作为一种变通方法,我需要迭代该窗体中的所有控件并应用新资源。我一点也不喜欢这样。
对于其他问题,我不能做Application.Restart();而且我的表单非常重,所以我不想隐藏表单并创建一个新的表单。
那么有没有其他方法可以重新加载我的表单呢?
发布于 2013-07-25 05:53:59
因此,根据您想要做的事情,我认为您可以避免迭代整个表单组件集合的唯一方法是迭代特定于区域性的资源,并将它们应用于控件。这应该是一个较小的集合,因为只有窗体上的控件子集才具有需要更改的值。它看起来像这样:
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);
}
}请注意,这不是迭代forms控件集合,而是迭代资源文件中的键,使用反射查找窗体上的组件,并仅将资源应用于文件中具有设置的那些组件。
这只是一个示例,我认为它相当脆弱(即在表单上没有对应字段的嵌套网格视图组件。有多个“”的名称。资源文件中的级别等)但我希望这足以让你入门!
发布于 2017-03-24 03:43:19
也许它会为你工作。
添加到clicking事件或任何
this.Controls.Clear();
InitializeComponent();发布于 2013-07-26 03:43:33
我找到了另一种选择。
我正在将所有的控件添加到一个userControl中。所以我的主窗体只包含一个Usercontrol。
现在,当更改语言时,我只需删除用户控件,处理它,创建一个新的用户控件并将其添加到窗体中。
你们对这种方法有什么看法?
https://stackoverflow.com/questions/17842941
复制相似问题