C# 在运行时更改窗口窗体中TabControl的语言

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"); }

我是Windows窗体的新手,我正在尝试用英语和德语本地化我的应用程序,我想在运行时更改语言。到目前为止,我已经能够通过使用.resx文件和以下代码来做到这一点:

    //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()是一个非常严重的错误,顺便说一句,它没有按照这里的要求处理控件。请记住,这是一种用户从未实际使用过的代码,他们在使用表单时实际上并没有学习其他语言。