获取所有winforms控件及其属性的列表

本文关键字:属性 列表 控件 winforms 获取 | 更新日期: 2023-09-27 18:03:27

我需要使一个遗留程序(其巨大)支持另一种语言。尽管我非常想把我的单语言项目文件发给他们,并让他们做剩下的工作,但当我这样做时,翻译机构往往会提出异议。

所以我希望生成一个项目中的所有UI控件及其当前显示的默认文本的列表。然后我将其发送给翻译人员,并生成一个带有结果的.resx文件。据我所知,只要我为目标语言正确命名resx文件,并将localizable属性设置为true,一旦文化发生变化,它就会切换控件上的所有文本。如果我在这个问题上有问题,请告诉我,我把时间花在嵌入式世界上,出于某种原因,上级决定我应该是解决这个问题的人。

我想我可以通过解析设计师文件来获得列表,但我希望有人有一个更优雅的解决方案,或者知道一个人已经建立。这似乎是一个很常见的任务。

获取所有winforms控件及其属性的列表

嗯,因为我不知道一些真正重要的参数,所以我不能确定是否使用商业工具是一种选择;我也不知道你有多少表单,或者有多少表单和控件是动态创建的。

但是对于一个简单的控制转储函数,可能像这样的东西是一个开始:

private void dumpControls(Control ctl, string parents)
{
  if (parents == "") parents = ctl.Name; else parents += "." + ctl.Name;
  if (ctl.Name != "" && ctl.Text != "") Console.WriteLine(parents  + "=" + ctl.Text);
  foreach (Control ct in ctl.Controls) dumpControls(ct, parents);
}

您可以将其放入表单的构造函数中:

public Form1()
{
  InitializeComponent();
  if (dumpMode) dumpControls(this, "");
  ..
}

如果您不想要完整的父容器列表,您可以轻松地修改代码,例如:

 if (parents == "") parents = this.Name + "." + ctl.Name; else parents += "." + ctl.Name;
 if (ctl.Name != "" && ctl.Text != "") Console.WriteLine(parents  + "=" + ctl.Text);
 foreach (Control ct in ctl.Controls) dumpControls(ct, "")

您可能希望在表单前添加控件,使控件引用在各个表单中是唯一的。

显然,您不仅需要将此添加到每个表单,还需要打开每个表单。我不知道这是否会成为一个问题,但我确信真正的工作将是检查您的代码并更改所有需要转换为其他内容的硬编码文字。我去过那里,用过字典;工作得很好,但相当多的工作,也是惊人的,因为我不知道到底有多少字面量潜入了我的(自己的)代码…

在表单加载或用户更改语言时加载字符串。除了内置的资源;我也可以将外部语言文件读入字典..

比起将数据转储到控制台,您可以将其塞进StringBuilder并将其写入文件。

您可以使用以下代码获取表单中的控件:

foreach (Control control in this.Controls)
{
    MessageBox.Show(control.Name + "'n" + control.Text);
}

但是它只显示窗体上的控件。如果您有组盒,您也应该在组盒中使用相同的代码。或者如果你有tabcontrol,你应该为它单独做这个。