Winforms 如何处理不同长度的标签–;动态布局

Winforms 如何处理不同长度的标签–;动态布局,winforms,layout,internationalization,Winforms,Layout,Internationalization,我必须允许替换winforms应用程序中的所有文本;它是一个旧的应用程序,处于“维护”状态。该应用程序是在.NETV1.1中编写的,后来的部分是在.NETV2中编写的,因此它不使用任何布局控件 我遇到的问题是,当字符串比默认字符串长时,我需要让UI处理。然而,由于存在风险,我不希望对代码进行太多更改 在过去,我发现简单的更改,如向窗体添加面板并将当前控件拖到窗体上,会丢失事件连接等。由于WinForms设计器移动代码的方式,使用DIFF很难发现此类问题。因此,如果可能,希望避免对控制树进行任何更

我必须允许替换winforms应用程序中的所有文本;它是一个旧的应用程序,处于“维护”状态。该应用程序是在.NETV1.1中编写的,后来的部分是在.NETV2中编写的,因此它不使用任何布局控件

我遇到的问题是,当字符串比默认字符串长时,我需要让UI处理。然而,由于存在风险,我不希望对代码进行太多更改


在过去,我发现简单的更改,如向窗体添加面板并将当前控件拖到窗体上,会丢失事件连接等。由于WinForms设计器移动代码的方式,使用DIFF很难发现此类问题。因此,如果可能,希望避免对控制树进行任何更改

因此,我正在寻找某种布局管理器,我可以将其添加到表单中,而无需更改其余代码(或控制树)——有什么理想吗

我还有其他的选择吗

(更换字符串的人员本身不具备重新排列控件的技能;这也将是一场维护噩梦,因为标签可能需要为每个客户提供不同的值)

(回答说,“如果我是你,我就不会从这里开始”是没有用的)


有人知道控制树外部的布局管理器吗?例如,我可以将它指向一个窗体,它将接管控件的布局,而不必使所有控件都成为布局管理器的子控件



.

我没有太多的版面管理经验,而且我也不是一个真正的UI设计师,所以我不太愿意回答,但看到似乎没有其他人这样做,我就插手思考

如果您唯一的问题是您不信任设计师进行剪切和粘贴(即您信任设计师进行重新调整大小),那么您可以手动完成该部分

我过去所做的(不是因为我不信任设计师,而是因为我发现这样做有时更容易),是:

(假设为C#,并在现有表单中添加新面板)

1) 确保我有备份(通常在源代码管理中)

2) 将面板添加到表单(通常与设计器一起)

3) 关闭设计器并打开代码(xxx.cs或xxx.designer.cs),找到将所有顶级控件添加到窗体中的位置,然后移动所有顶级控件(除了面板)以将它们添加到面板中

Ie你从一些类似的名字开始(希望有更多有意义的名字)

结果是

this.panel1.Controls.Add(this.label1);
this.panel1.Controls.Add(this.textBox1);
etc 

this.form1.Controls.Add(this.panel1);
较新的表单可能会使用如下语法 this.form1.Controls.AddRange(新System.Windows.Forms.Control[]{ 这个标签1, 此.TextBox1,
等 这是(1})

但原则是一样的

4) 再做一次备份。(这就是我希望有一个源代码管理包的地方,它允许我在不让其他人看到的情况下执行临时/私人/个人备份。)

5) 在设计器中打开表单并检查所有控件是否都存在

6) 根据需要开始修改布局


或者,我还没有尝试过,但是如果您不能将Beyond Compare(请参阅)配置为只比较事件连接行(即包含+=字符的连接行),那么我会非常惊讶,这将使您更容易发现丢失的连接行。

不幸的是,我不知道有这样的布局管理器。然而,我有一个建议,其中包括一些最小的(但我认为是安全的)代码更改。我在下面假设只有标签有问题,但是这个概念也可以扩展到其他WinForm对象。我还假设所有文本最初都是在设计器中设置的

首先,创建一个从Label继承的类。让我们称之为SuperLabel暂时不做任何事情

下一步,搜索并替换

新的System.Windows.Forms.Label()

新的超级标签()

这是一个相当安全的改变。当然,您应该在执行过程中进行备份等,但是在这次替换之后,您的设计器和应用程序应该像以前一样100%正常工作。毕竟,现在SuperLabel只是一个标签而已

最后,连接到一些事件,如下面的伪代码:

public class SuperLabel : Label { public SuperLabel() { this.ParentChanged += new EventHandler(SuperLabel_ParentChanged); } void SuperLabel_ParentChanged(object sender, EventArgs e) { // Here you have the Text property, the Size property etc available string newText = GetNewTextFromSomeDictionary(Text); int lengthOfOriginalText = CalculateLengthOfOriginalText(); int lengthOfNewText = CalculateLengthOfNewText(); if (lengthOfNewText > lengthOfOriginalText) newText = CreateNewShorterTextSomehow(newText, lengthOfOriginalText); Text = newText; } // TODO: Implement the methods in the pseudo code here ... } 公共类超级标签:标签 { 公共超标签() { this.ParentChanged+=新事件处理程序(SuperLabel\u ParentChanged); } 无效SuperLabel\u ParentChanged(对象发送方,事件参数e) { //这里有文本属性、大小属性等 字符串newText=GetNewTextFromSomeDictionary(文本); int lengthOfOriginalText=计算原始文本的长度(); int lengthOfNewText=计算newtext()的长度; 如果(lengthOfNewText>lengthOfOriginalText) newText=createnewshortext(newText,lengthOfOriginalText); 文本=新文本; } //TODO:在这里实现伪代码中的方法。。。 } 正如您所看到的,这使您可以非常安全地在一个地方进行代码更改。在这个解决方案中,所有新文本都添加到某个键值字典中,例如来自xml文件或其他什么。这将允许替换字符串的人员在远离代码的情况下执行此操作,避免在设计器中进行任何更改,并处理过长的字符串

希望这有帮助

网站上说,这可能会有所帮助

可以很容易地实现到 用一行代码设计表单


我还没有详细了解它,它似乎主要是关于分辨率更改时的缩放控件。

“过去我发现,向窗体添加面板并将当前控件拖动到窗体上等简单更改都会丢失事件连接等。”-您确定从一个家长给另一个家长服用药物,还是剪切/粘贴?拖曳 public class SuperLabel : Label { public SuperLabel() { this.ParentChanged += new EventHandler(SuperLabel_ParentChanged); } void SuperLabel_ParentChanged(object sender, EventArgs e) { // Here you have the Text property, the Size property etc available string newText = GetNewTextFromSomeDictionary(Text); int lengthOfOriginalText = CalculateLengthOfOriginalText(); int lengthOfNewText = CalculateLengthOfNewText(); if (lengthOfNewText > lengthOfOriginalText) newText = CreateNewShorterTextSomehow(newText, lengthOfOriginalText); Text = newText; } // TODO: Implement the methods in the pseudo code here ... }