我意识到互联网上有很多关于减少 Windows 窗体应用程序闪烁的问题。经过大量实验,我发现在我的特殊情况下的解决方案非常简单:设置 Control.DoubleBuffered
显示闪烁的控件的属性为 true。我通过简单地从必要的控制类(在我的例子中,从 ListView
到 DoubleBufferedListView
和从 DataGridView
到 DoubleBufferedDataGridView
)派生来实现这一点。
我正在开发的应用程序的罪魁祸首是 DataGridView
它更新了 Tick
上的许多单元格Windows.Forms.Timer
的事件目的。在启用双缓冲之前,网格会在大多数更新中轻微闪烁(不是太糟糕,但足以引起注意)。启用双缓冲后,闪烁消失了。
但是,我在这里谈论的是我的开发机器。不幸的是,这个应用程序实际上是由最终用户通过远程桌面连接运行的,这是我从 this blog post by Raymond Chen 中了解到的。表示我应该 不是 使用双缓冲。
那么,我的问题是:什么 应该 我用? Chen 建议在本地机器上的双缓冲方法和远程桌面连接上的传统非双缓冲方法之间切换;但在这种情况下,该应用程序的最终用户仍会遇到闪烁。这简直是不可避免的吗?
备案:这是不是 一个简单的电话BeginUpdate
/EndUpdate
(已经在 ListBox
和 ListView
控件上执行此操作)或 SuspendLayout
/ResumeLayout
(已经为 DataGridView
控件这样做了,尽管我认为这并不是特别重要,因为正如我所说,我只是在更新某些单元格中的值)。
也许一个无闪烁的远程桌面应用程序根本不可能?
最佳答案
在“值得一试”类别中:设置标志 AllPaintingInWmPaint
在控件上,或按照此处的建议覆盖 OnPaintBackground:http://alt.pluralsight.com/wiki/default.aspx/Craig/FlickerFreeControlDrawing.html
这将有助于使背景油漆在时间上更接近前景油漆。这将提高它们同时从客户端发送到服务器的机会。
关于.net - 如何为通过远程桌面运行的应用程序获得流畅、无闪烁的 GUI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2412247/