这个问题可能被认为是后续问题使用ownerdraw和virtualmode在列表视图中闪烁 https://stackoverflow.com/questions/938896/flickering-in-listview-with-ownerdraw-and-virtualmode.
我有一个ListView
控制在Virtual mode
我尝试执行自定义绘图。项目渲染是通过以下方法重写完成的:
protected override void OnDrawItem(DrawListViewItemEventArgs eventArgs)
正如所引用的问题中提到的,自定义绘图会在鼠标悬停事件上引入闪烁。调试器告诉我这是由于过量被触发的自定义绘制事件。
现在 - 所引用问题的公认答案告诉我们:
这是 .NET 的 ListView 中的一个错误,您无法通过以下方式绕过它
双缓冲。
So, 该信息的可靠性如何?那真的是一个bug?或者也许我们只是尝试切断一部分消息并希望它不会改变可见的行为?
这是真的吗?如果我让我的主人为ListView
in Virtual Mode,
我可以压制这些Custom Draw
事件并且只执行我的绘图WM_PAINT
或者,也许这在某些情况下是不正确的?
申请的前提条件是什么System.Windows.Forms
控制能够完成所有的绘画WM_PAINT
不改变它的初始行为?
至少对于OnDrawItem的双缓冲来说,存在bug是不正确的,但它有点愚蠢:有一个受保护的属性可以设置,但需要重写ListView。我创建了这样的类:
public class MyListView : ListView
{
public MyListView()
: base()
{
DoubleBuffered = true;
}
}
然后在 MyForm.Designer.cs 文件中,我使用以下行更改 ListView 的实例化:
private ListView myListView;
this.myListView = new MyListView();
OnDrawItem 将发挥作用!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)