如何应对不同长度的标签 - 动态布局

时间:2009-07-07 09:35:00

标签: winforms layout internationalization

我必须启用winforms应用程序中的所有文本才能被替换;它是一个旧的应用程序,并在“维护”。该应用程序是在.NET v1.1中编写的,后来在.NET v2中使用,因此它不使用任何布局控件。

我遇到的问题是,当字符串长于默认字符串时,我需要使UI处理。但是,由于风险,我不希望对代码进行大量更改。

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

所以我正在寻找某种布局管理器,我只需添加到表单中而不必更改代码的其余部分(或控制树) - 任何理想?

我应该看看其他任何选项吗?

(正在替换字符串的人没有专门重新安排控件的技能;这也是维护的噩梦,因为标签可能需要为每个客户设置不同的值)

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


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


see also this thread on the msdn Forums

3 个答案:

答案 0 :(得分:1)

我对布局管理人员没有多少经验,而且我不是一个真正的UI设计师,所以我对回复犹豫不决,但看到其他人似乎没有,我会考虑我的想法。< / p>

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

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

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

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

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

3)关闭设计器并打开代码(xxx.cs或xxx.designer.cs)并找到它将所有顶级控件添加到表单的位置并移动所有这些控件(除了面板之外)以添加它们到小组。

即你从一些喜欢的开始(希望有更有意义的名字)

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

并以

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

this.form1.Controls.Add(this.panel1);

较新的表单可能会使用类似的语法     this.form1.Controls.AddRange(new System.Windows.Forms.Control [] {         this.label1,         this.TextBox1,
        等等         this.panel1});

但校长是相同的。

4)做另一个备份。 (这是我希望我有一个源代码控制包,允许我进行临时/私人/个人备份而不让其他人看到它。)

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

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

或者,我还没有尝试过,但是如果你不能配置Beyond Compare(参见http://www.scootersoftware.com)来比较事件挂钩线(即包含+ =字符的那些),我会非常惊讶如果有任何遗失,那么应该更容易发现它。

答案 1 :(得分:1)

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

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

下一步,搜索&amp;替换

的所有实例
  

new System.Windows.Forms.Label();

  

新的SuperLabel();

这是一个非常安全的改变。当然,你应该随身携带备份等,但是你的设计师和你的应用程序应该像以前那样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 ...
}

如您所见,这使您可以在一个地方非常安全地进行代码更改。在此解决方案中,所有新文本都添加到某个键值字典中,例如从xml文件或诸如此类的字体中添加。这样可以让替换字符串的人远离代码,这样可以避免在设计器中进行任何更改,并且可以处理太长的字符串。

希望这有帮助!

答案 2 :(得分:0)

该网站称,

.Net Forms Resize可能会有所帮助。

  

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

我没有在enought细节中看过它,知道,当分辨率发生变化时,似乎主要是关于缩放控件。