5

如何加快 WinForms 应用程序中 UserControls 的滚动速度?

我的主窗体在慢速机器上快速滚动时遇到了麻烦——为每个小的滚动增量进行绘制是 CPU 密集型的。

我的表单有大约五十个用户控件(带有多个字段),一个位于另一个之下。我尝试拦截 OnScroll 和 UserPaint 以消除一些非常小的滚动事件不必要的重新绘制,但无论如何都会调用底层的 Paint。

如何在较慢的机器上简化滚动?

4

3 回答 3

3

行之有效的方法是使用屏幕外位图,该位图仅在您的控件表示的数据实际更改时才更新;然后,所有OnPaint需要做的就是将该位图渲染到屏幕上。

如果您的绘制过程很密集,并且由于您有很多控件,您会发现这会对您的应用程序的性能产生巨大的影响。

请注意,使用DoubleBufferingcontrol 属性对您的情况没有帮助 - 它确实告诉 WinForms 在渲染到屏幕之前渲染到屏幕外位图,但这仍然会在每个绘制周期发生,因为 WinForms 不会跟踪表示的时间已经改变。

所以,你必须自己动手。这并不难。这是一篇关于该主题的相当不错的文章

于 2010-05-03T15:57:31.350 回答
2

您还可以增加滚动步的大小。例如

panel1.VerticalScroll.SmallChange = 100;

每次单击滚动条按钮,面板将使其内容垂直滚动 100 个单位。因此,您每次都采取更大的步骤,这至少可能会使体验感觉更好。当然,你也可以对水平滚动条做同样的事情。

于 2010-05-03T16:29:49.267 回答
1

我使用标签来消除滚动。

于 2010-05-03T15:57:16.980 回答