如何加快 WinForms 应用程序中 UserControls 的滚动速度?
我的主窗体在慢速机器上快速滚动时遇到了麻烦——为每个小的滚动增量进行绘制是 CPU 密集型的。
我的表单有大约五十个用户控件(带有多个字段),一个位于另一个之下。我尝试拦截 OnScroll 和 UserPaint 以消除一些非常小的滚动事件不必要的重新绘制,但无论如何都会调用底层的 Paint。
如何在较慢的机器上简化滚动?
如何加快 WinForms 应用程序中 UserControls 的滚动速度?
我的主窗体在慢速机器上快速滚动时遇到了麻烦——为每个小的滚动增量进行绘制是 CPU 密集型的。
我的表单有大约五十个用户控件(带有多个字段),一个位于另一个之下。我尝试拦截 OnScroll 和 UserPaint 以消除一些非常小的滚动事件不必要的重新绘制,但无论如何都会调用底层的 Paint。
如何在较慢的机器上简化滚动?
行之有效的方法是使用屏幕外位图,该位图仅在您的控件表示的数据实际更改时才更新;然后,所有OnPaint
需要做的就是将该位图渲染到屏幕上。
如果您的绘制过程很密集,并且由于您有很多控件,您会发现这会对您的应用程序的性能产生巨大的影响。
请注意,使用DoubleBuffering
control 属性对您的情况没有帮助 - 它确实告诉 WinForms 在渲染到屏幕之前渲染到屏幕外位图,但这仍然会在每个绘制周期发生,因为 WinForms 不会跟踪表示的时间已经改变。
所以,你必须自己动手。这并不难。这是一篇关于该主题的相当不错的文章。
您还可以增加滚动步的大小。例如
panel1.VerticalScroll.SmallChange = 100;
每次单击滚动条按钮,面板将使其内容垂直滚动 100 个单位。因此,您每次都采取更大的步骤,这至少可能会使体验感觉更好。当然,你也可以对水平滚动条做同样的事情。
我使用标签来消除滚动。