在表单设计器

时间:2017-01-24 11:12:29

标签: c#

这个MSDN article提供了一些关于手动自定义表单设计器以提高性能的好建议:

  • 在启动期间减少控件上的方法和属性调用次数。例如,Controls.Bounds比调用Control.Location和Control.Size更好。

  • 从上到下创建表单。在嵌套控件层次结构中,在将控件添加到容器之前设置容器的父属性(使用上述规则)。与BigForm应用程序一样,在40个控件连接到面板之前,面板的父属性设置为表单。如果层次结构中存在较低的其他容器,则应应用相同的更改。

我遵循了第一点建议,取而代之的是:

this.MyControl.Location = new System.Drawing.Point(5, 5);
this.MyControl.Size = new System.Drawing.Size(630, 90);

使用:

this.MyControl.Bounds = new System.Drawing.Rectangle(5, 5, 630, 90);

这导致一张表格加速超20%(约200毫秒)。我试图遵循第二点的建议而不太确定如何继续。 Designer.cs文件包含以下代码:

this.Controls.Add(this.pnlHeader);

但不是我期望的代码(根据示例):

this.pnHeader.Parent = this;    // Not in the Designer

代码this.Controls.Add(this.pnlHeader);显示在InitializeComponent的底部。建议是否建议将代码移至顶部或其他内容?

3 个答案:

答案 0 :(得分:1)

编辑#2

我发现this msdn article解释了以下问题:

  

另一种提高性能的方法是初始化控件   在控制树中自上而下。例如,如果您有面板控件   在其中有许多控件,首先创建面板,然后添加   控制面板。另外,设置的父属性   控件而不是添加到Controls集合可以改进   性能。

例如,考虑将一个文本框添加到面板的控件集合中:

优化之前:

// Create a new panel and textbox control
Panel panel1 = new Panel();
TextBox textBox1 = new TextBox();

// Set the Text property of the TextBox control
textBox1.Text = "My Text";

// Add the TextBox to the Panel's control collection
panel1.Controls.Add(this.textBox1);

// Add the Panel to the Form's control collection
this.Controls.Add(panel1);

//... subsequent controls 

使用自顶向下和父级技术优化此代码段会产生以下代码段:

优化后:

// Create a new panel and textbox control
Panel panel1 = new Panel();
TextBox textBox1 = new TextBox();

// set parents from top to down
this.panel1.Parent = this;
this.textBox1.Parent = this.panel1;

// Set properties of child control (cause repainting only once)
textBox1.Text = "My Text";

//... subsequent controls 
  

这可以与深层嵌套的控件层次结构产生重大差异。   通过创建优化InitializeComponent方法中的代码   自上而下的控件和重新设置它们导致了性能   比生成的默认Forms Designer提高了约50%   代码!

答案 1 :(得分:1)

S.Serp的回答后,这里有一些值得注意的观察结果:

  • Location替换SizeBounds导致表单加载平均提升约15%。
  • Controls.Add取代Parent导致进一步提升约5-10%(总计约20-25%)。
  • 正如Sefe指出的那样,手动编辑Designer.cs文件通常只适用于您不经常在Designer中进行更改的情况。 Designer中所做的任何更改都将覆盖您的手动代码。被警告!这不是灾难,你只是失去了提升。使用较慢的表格加载或重做手动更改。
  • Bounds控件(如果已启用)上设置Multiline = true; 之后,请务必将TextBox调用 。如果您之前设置它,您的控件将(无益)调整为一行。
  • 小心确保每个子控件都正确设置了父级控件!手动编辑InitializeComponent后,在Visual Studio Designer中打开所有表单,看一切都是犹太人的......但不要编辑任何内容,否则您的更改将被删除。

答案 2 :(得分:0)

线条......

this.Controls.Add(this.pnlHeader);

...和...

this.pnHeader.Parent = this;

......是等价的。他们生产的控制树是相同的。而且您不应该更改自动生成的代码。下次设计者编写更新时,您的更改将被覆盖。

您通常不必担心设计人员生成的代码。您可以专注于自己,并假设设计师是正确的。