Windows窗体应用程序性能

时间:2020-03-05 18:47:56  来源:igfitidea点击:

我的应用程序表面上有很多控件,并且在运行时会动态添加更多控件。

尽管我使用制表符来限制所显示控件的数量,并且也使用了双缓冲,但是当它需要重新绘制(调整大小,最大化等)时,它仍然会闪烁和断断续续。

我们有什么技巧和窍门来提高WinForms应用程序的性能?

解决方案

回答

我们是否充分利用了SuspendLayout()和ResumeLayout()?

http://msdn.microsoft.com/zh-CN/library/system.windows.forms.control.suspendlayout(VS.80).aspx

回答

我知道我们可以做两件事,但并非总是适用于所有情况。

  • 如果为每个控件(myNewlyCreatedButton.Location.X / Y)使用绝对定位,而不是使用流布局面板或者表布局面板,则将获得更好的性能。 WinForms要做的数学运算要少得多,以便弄清楚应该在哪里放置控件。
  • 如果我们要在其中添加/删除/修改很多控件的单个操作,请在受影响的控件的容器(无论是面板还是整个窗体)上以及当我们使用"我们可以在同一面板上用" ResumeLayout()"完成工作。如果不这样做,则每次添加/删除/修改控件时,表单都必须进行布局遍历,这会花费更多时间。请参阅:http://msdn.microsoft.com/zh-cn/library/system.windows.forms.control.suspendlayout(VS.80).aspx

虽然,我不确定在调整窗口大小时这些方法如何应用。

回答

Although, I'm not sure how these approaches could apply when resizing a window.

处理ResizeBegin和ResizeEnd事件以调用SuspendLayout()和ResumeLayout()。这些事件仅在System.Windows.Form类上(尽管我希望它们也在Control上)。

回答

尽管比其他一些技巧更笼统,但这是我的:

当使用大量"项目"时,请尝试避免为每个项目创建一个控件,而应重用这些控件。例如,如果我们有10,000个项目,每个项目对应一个按钮,则很容易(以编程方式)创建一个10,000个按钮并连接其事件处理程序,这样,当我们输入事件处理程序时,我们便会确切知道哪个元素你必须继续努力。但是,如果创建(假设)500个按钮(因为我们一次只能在屏幕上看到500个按钮),并在按钮和项目之间引入"映射层",则效率会高得多,因为每当用户执行某项操作时,都会将按钮重新分配给不同的项目,这将导致更改应可见的按钮组(例如,移动滚动条)。