控件放在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); // 递归调用
}
}
}
}