C# 在运行时更改窗口窗体中TabControl的语言
我是Windows窗体的新手,我正在尝试用英语和德语本地化我的应用程序,我想在运行时更改语言。到目前为止,我已经能够通过使用.resx文件和以下代码来做到这一点:C# 在运行时更改窗口窗体中TabControl的语言,c#,.net,winforms,C#,.net,Winforms,我是Windows窗体的新手,我正在尝试用英语和德语本地化我的应用程序,我想在运行时更改语言。到目前为止,我已经能够通过使用.resx文件和以下代码来做到这一点: //fired when clicking the german MenuItem private void deutschToolStripMenuItem_Click(object sender, EventArgs e) { ChangeLanguage("de-DE"); }
//fired when clicking the german MenuItem
private void deutschToolStripMenuItem_Click(object sender, EventArgs e)
{
ChangeLanguage("de-DE");
}
//fired when clicking the english MenuItem
private void englischToolStripMenuItem_Click(object sender, EventArgs e)
{
ChangeLanguage("en-US");
}
private void ChangeLanguage(string lang)
{
Thread.CurrentThread.CurrentUICulture = new
System.Globalization.CultureInfo(lang);
ComponentResourceManager resources = new ComponentResourceManager(typeof(Main0));
resources.ApplyResources(this, "$this");
ApplyResources(resources, this.Controls);
}
private void ApplyResources(ComponentResourceManager resources, Control.ControlCollection ctls)
{
//all controls
foreach (Control ctl in ctls)
{
resources.ApplyResources(ctl, ctl.Name);
ApplyResources(resources, ctl.Controls);
}
//the menu bar and its items
foreach (ToolStripItem item in mst_Main.Items)
{
if (item is ToolStripDropDownItem)
{
resources.ApplyResources(item, item.Name);
foreach (ToolStripItem dropDownItem in ((ToolStripDropDownItem)item).DropDownItems)
{
resources.ApplyResources(dropDownItem, dropDownItem.Name);
}
}
}
}
这适用于主窗体、其菜单栏及其控件(例如按钮、标签)
但是,它不适用于稍后添加到表单中的TabControl:
pan_Main.Controls.Clear();
mainTabControl = new MainTabControl(index);
mainTabControl.Dock = DockStyle.Fill;
pan_Main.Controls.Add(mainTabControl);
pan_Main.Controls.Add(tbl_Main);
如果我现在尝试更改语言(通过主窗体上的菜单栏/MenuStrip),TabControl及其所有基础控件的语言不会更改。如果我更改了语言,在将TabControl添加到表单之前(在调用其InitializeComponent()方法之前),TabControl将使用正确的语言初始化
因此,更改语言的方法(如上所述)似乎确实会影响TabControl,但不会更新其元素
有没有一种简单的方法可以在运行时切换TabControl及其底层元素的语言,而无需重新创建它?如果是这样的话,你能告诉我我的代码哪里错了或者我遗漏了什么吗。经过几个小时的代码实验,我仍然找不到解决这个问题的方法
提前Thx您发布的代码可以。问题在其他地方,“以后添加”无疑是关键问题。您必须重新运行ApplyResources()。很有可能这也没什么用,因为选项卡控件看起来不像是见过设计师。你至少需要一个用户控件。像那样使用Controls.Clear()是一个非常严重的错误,顺便说一句,它没有按照这里的要求处理控件。请记住,这是一种用户从未实际使用过的代码,他们在使用表单时实际上并没有学习其他语言。