【问题标题】:getting a list of all winforms controls and their properties获取所有 winforms 控件及其属性的列表
【发布时间】:2014-05-14 18:55:53
【问题描述】:

我需要让一个遗留程序(其庞大的)支持另一种语言。尽管我非常想将我的单语项目文件发送给他们并要求他们完成其余的工作,但当我这样做时,翻译机构往往会与之抗争。

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

我想我可以解析设计器文件来获取列表,但我希望有人有一个更优雅的解决方案,或者知道有人已经构建了一个。这似乎是一项非常常见的任务。

【问题讨论】:

  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
  • 我只是从 VS 中的 resx 设计器中复制并粘贴到 Excel 中,然后将电子表格交给翻译人员,然后在完成后粘贴回来。
  • @Dai- 写这个程序的人已经硬编码了很多,所以英文版没有 resx 文件。我希望当文化改变为一种新语言并且有一个属性时,比如说,Japenese resx 文件,它将覆盖现在那里的硬编码英语。

标签: c# winforms visual-studio-2013 resx


【解决方案1】:

好吧,因为我不知道一些真正重要的参数,所以我不能确定,例如选择商业工具是一种选择;另外我不知道你有多少表单或者动态创建了多少表单和控件..

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

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 并将其写入文件,而不是将数据转储到控制台。

【讨论】:

  • @TaW- 感谢您的回复。你是对的,找到显示在 80 个左右窗口中的任何一个窗口中的文字是一件很痛苦的事情。我决定从默认的 .resx 文件中解析出控件并将列表转储到 excel 中。
【解决方案2】:

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

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

但它只显示表单上的控件。如果你有一个 groupbox,你也应该使用你的 groupbox 相同的代码。或者如果你有 tabcontrol,你应该单独为它做这件事。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 2010-12-21
    • 2021-12-24
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多