在运行时更改Window窗体中TabControl的语言

时间:2014-03-01 21:14:33

标签: c# .net winforms

我是Windows Forms的新手,我正在努力使我的应用程序可以用英语和德语进行本地化,我想在运行时更改语言。到目前为止,我已经能够通过使用.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及其底层元素切换语言而无需重新创建它?如果是这样,你能告诉我我的代码在哪里错了或我错过了什么。经过几个小时的代码试验后,我仍然找不到解决这个问题的方法......

提前谢谢

0 个答案:

没有答案