winform的控件在tabControl控件里切换中英文

控件放在TabControl里时,切换语言(通常是通过更改CurrentUICulture并重新应用资源)的行为与直接放置在Form页面上有所不同,这主要是由于资源应用的上下文和控件的层次结构差异造成的。

标题控件层次结构

当控件直接放置在Form上时,它们是Form的直接子控件。在资源文件中,你可以直接为这些控件指定本地化资源(如文本、图像等),并且当你更改CurrentUICulture并重新应用资源时,这些资源会立即反映到控件上。

然而,当控件被放置在TabControl的TabPage中时,这些控件成为TabPage的子控件,而不是Form的直接子控件。虽然TabPage本身是TabControl的子控件,但TabPage中的控件在资源文件中的引用路径会有所不同。因此,在重新应用资源时,你需要确保资源文件正确地为这些嵌套的控件指定了本地化资源,并且资源应用过程能够遍历到这些嵌套的控件。

标题资源应用过程

在资源应用过程中,ComponentResourceManager(或其类似机制)会遍历Form上的控件,并尝试为它们匹配并应用相应的资源。然而,这个过程可能不会自动遍历到嵌套的控件(如TabPage中的控件),除非你在资源应用代码中显式地处理这种嵌套关系。

在设置好中英文资源包的状态下使用以下代码

using System.Threading;
using System.Windows.Forms;

namespace language_change
{
    public partial class Form2 : Form
    {       
        public Form2()
        {
            InitializeComponent();
        }
        ComponentResourceManager resource = new ComponentResourceManager(typeof(Form2));
        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (comboBox1.SelectedIndex == 0)
            {
                Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("zh");
                ApplyResource();
            }
            else
            {
                Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en");
                ApplyResource();
            }
        }
        private void ApplyResource()
        {
            foreach (Control control in this.Controls)
            {
                // 如果control是TabControl,则进一步处理  
                if (control is TabControl tabControl)
                {
                    ApplyResourcesToTabControl(tabControl);
                }
                else
                {
                    // 对Form上的其他直接控件应用资源  
                    resource.ApplyResources(control, control.Name);
                }
            }
        }
        private void ApplyResourcesToTabControl(TabControl tabControl)
        {

            foreach (TabPage tabPage in tabControl1.TabPages)
            {
                // 遍历当前 TabPage 中的所有子控件
                foreach (Control item in tabPage.Controls)
                {
                    // 使用资源文件中的数据来设置控件属性
                    resource.ApplyResources(item, item.Name);
                }
            }
        }
        private void ApplyResourcesToControlChildren(Control control)
        {
            // 递归方法,用于处理控件的子控件  
            foreach (Control childControl in control.Controls)
            {
                resource.ApplyResources(childControl, childControl.Name);
                ApplyResourcesToControlChildren(childControl); // 递归调用  
            }
        }
       
    }
}

窗口显示,下拉框选择要使用的语言,tabcontrol页面里的所有内容都会更改

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值