我们在DataGridViews上遇到了性能问题,在该问题上重绘非常慢,并且找到了解决方案Here来创建派生类型并在控件上启用双缓冲。
(因为DoubleBuffered属性受保护,所以派生类型是必需的)

将DoubleBuffered属性设置为true似乎没有任何缺点。

最佳答案

它受到保护,因为DGV继承了Control的属性。并且Control.DoubleBuffered受保护。这是有道理的,因为每个派生的控件都应自行决定将其打开。而且,控制用户随意打开或关闭它也没有意义。 DGV设计师决定出发。

他们可能决定的一个原因是,双缓冲实际上会使绘画变慢。渲染缓冲区位图的额外步骤要花费时间。它只是人眼看起来更快,您会观察到位图突然出现。您看不到绘制到位图所需的时间。除非需要绘制其他控件,并且它们在DGV之后轮到他们,否则它是非常明显的。

您所看到的是首先绘制表单,在控件所在的位置有孔。那些孔有白色背景。使用TransparencyKey或Opacity属性时为黑色。然后,每个控件都将获取Paint事件,并且将孔一一填充。该效果也被用户视为闪烁,尽管它与DoubleBuffered解决的闪烁不同。背景为黑色时尤其明显。

解决此问题所需的方法是,整个表单及其所有控件都是双缓冲的。 Windows窗体中没有该功能。但是,Windows XP和更高版本实际上支持此功能。检查this thread看看如何完成。请注意,它可能具有该线程中记录的副作用。

关于.net - 为什么在DataGridView上DoubleBuffered属性默认为false,为什么要对其进行保护?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/252689/

10-16 06:39