我们遇到了DataGridViews的性能问题,重绘速度非常慢,我们找到了解决方案Here来创建一个派生类型,并在控件上启用双缓冲。(派生类型是必需的,因为DoubleBuffered属性是受保护的)
将DoubleBuffered属性设置为true似乎没有任何缺点。
发布于 2012-04-23 16:30:58
我认为这是最好的解决方案:
typeof(DataGridView).InvokeMember(
"DoubleBuffered",
BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.SetProperty,
null,
myDataGridViewObject,
new object[] { true });找到here
发布于 2008-10-31 20:37:44
它是受保护的,因为DGV继承了Control的特性。Control.DoubleBuffered是受保护的。这是有意义的,因为每个派生控件都应该自己决定打开它。对于控件用户来说,随意打开或关闭它是没有意义的。DGV的设计师决定离开。
他们可能决定这样做的一个原因是双缓冲实际上会使绘制速度变慢。渲染缓冲区位图的额外步骤需要时间。在人眼看来,它看起来更快,你可以观察到突然出现的位图。您看不到绘制到位图所需的时间。除非需要绘制其他控件,并且它们在DGV之后得到它们的轮换,否则它是非常明显的。
您所看到的是窗体首先被绘制,控件所在的位置有孔。这些洞的背景是白色的。使用TransparencyKey或Opacity属性时为黑色。然后,每个控件都会获得Paint事件,并逐个填充空洞。这种效果也被用户感知为闪烁,尽管它是一种与DoubleBuffered解决的不同类型的闪烁。当背景为黑色时,这一点尤其明显。
需要解决这个问题的是,整个窗体及其所有控件都是双缓冲的。这在Windows窗体中不可用。但是,Windows XP和更高版本实际上支持此功能。查看this thread,看看是如何做到的。请注意,它可能会有副作用,如该线程中所述。
发布于 2008-10-31 08:19:15
根据定义,双缓冲使用两个缓冲区和两倍的内存来呈现控件的视图。因此,这里有一些缺点,然而,以你现在在PC中获得的内存量而言,可能没有多少人会注意到这种牺牲。
不知道为什么是受保护的。也许该功能在早期版本的控件中不可用,并且当它被引入时,设计者不想更改控件的公共接口。或者,也许他们认为这是一个高级功能,并希望限制新接触该控件的人必须摸索的方法的数量,以便能够使它做一些有用的事情。
https://stackoverflow.com/questions/252689
复制相似问题