优化Windows窗体性能

  Windows 窗体为智能客户端应用程序提供了内容丰富的用户界面,并且您可以使用许多种技术来帮助确保 Windows 窗体提供最佳性能。在讨论特定技术之前,对一些可以显著提高 Windows 窗体性能的高级原则进行回顾是有用的。


  1)小心创建句柄。Windows 窗体将句柄创建虚拟化(即,它动态创建和重新创建窗口句柄对象)。创建句柄对象的系统开销可能非常大;因此,请避免进行不必要的边框样式更改或者更改 MDI 父对象。


  2)避免创建带有太多子控件的应用程序。Microsoft? Windows? 操作系统限制每个进程最多有10,000 个控件,但您应该避免在窗体上使用成百上千个控件,因为每个控件都要消耗内存资源。本节的其余部分讨论您可以用来优化应用程序用户界面性能的更为具体的技术。使用 BeginUpdate 和 EndUpdate许多 Windows 窗体控件(例如,ListView 和 TreeView 控件)实现了 BeginUpdate 和 EndUpdate 方法,它们在操纵基础数据或控件属性时取消了控件的重新绘制。通过使用BeginUpdate 和 EndUpdate 方法,您可以对控件进行重大更改,并且避免在应用这些更改时让控件经常重新绘制自身。此类重新绘制会导致性能显著降低,并且用户界面闪烁且不反应。例如,如果您的应用程序具有一个要求添加大量节点项的树控件,则您应该调用 BeginUpdate,添加所有必需的节点项,然后调用 EndUpdate。下面的代码示例显示了一个树控件,该控件用于显示许多个客户的层次结构表示形式及其定单信息。
  
  即使在您不希望向控件添加许多对象时,您也应该使用 BeginUpdate 和 EndUpdate 方法。在大多数情况下,您在运行之前将不知道要添加的项的确切个数。因此,为了妥善处理大量数据以及应付将来的要求,您应该总是调用 BeginUpdate 和 EndUpdate 方法。注调用 Windows 窗体控件使用的许多 Collection 类的 AddRange 方法时,将自动为您调用 BeginUpdate 和 EndUpdate 方法。使用 SuspendLayout 和 ResumeLayout许多 Windows 窗体控件(例如,ListView 和 TreeView 控件)都实现了 SuspendLayout 和 ResumeLayout 方法,它们能够防止控件在添加子控件时创建多个布局事件。如果您的控件以编程方式添加和删除子控件或者执行动态布局,则您应该调用 SuspendLayout 和 ResumeLayout 方法。通过 SuspendLayout 方法,可以在控件上执行多个操作,而不必为每个更改执行布局。例如,如果您调整控件的大小并移动控件,则每个操作都将引发单独的布局事件。这些方法按照与 BeginUpdate 和 EndUpdate 方法类似的方式操作,并且在性能和用户界面稳定性方面提供相同的好处。下面的示例以编程方式向父窗体中添加按钮:

  [C#]
  private void AddButtons()
  {
  // Suspend the form layout and add two buttons.
  this.SuspendLayout();
  Button buttonOK = new Button();
  buttonOK.Location = new Point(10, 10);
  buttonOK.Size = new Size(75, 25);
  buttonOK.Text = "OK";
  Button buttonCancel = new Button();
  buttonCancel.Location = new Point(90, 10);
buttonCancel.Size = new Size(75, 25);
  buttonCancel.Text = "Cancel";
  this.Controls.AddRange(new Control[]{buttonOK, buttonCancel});
  this.ResumeLayout();
  }
  [Visual Basic .NET]
  Private Sub AddButtons()
  ' Suspend the form layout and add two buttons
  Me.SuspendLayout()
  Dim buttonOK As New Button
buttonOK.Location = New Point(10, 10)
  buttonOK.Size = New Size(75, 25)
  buttonOK.Text = "OK"
  Dim buttonCancel As New Button
buttonCancel.Location = New Point(90, 10)
  buttonCancel.Size = New Size(75, 25)
  buttonCancel.Text = "Cancel"
  Me.Controls.AddRange(New Control() { buttonOK, buttonCancel } )
  Me.ResumeLayout()
  End Sub


  每当您添加或删除控件、执行子控件的自动布局或者设置任何影响控件布局的属性(例如,大小、位置、定位点或停靠属性)时,您都应该使用 SuspendLayout 和 ResumeLayout 方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小哭包

创作不易,给作者加个鸡腿吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值