【发布时间】:2010-10-30 15:32:57
【问题描述】:
我正在使用设置了以下参数的列表视图控件:
this.listView1.BackColor = System.Drawing.Color.Gainsboro;
this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.columnHeader1,
this.columnHeader2});
this.listView1.FullRowSelect = true;
this.listView1.HideSelection = false;
this.listView1.Location = new System.Drawing.Point(67, 192);
this.listView1.Name = "listView1";
this.listView1.Size = new System.Drawing.Size(438, 236);
this.listView1.TabIndex = 0;
this.listView1.UseCompatibleStateImageBehavior = false;
this.listView1.View = System.Windows.Forms.View.Details;
this.listView1.DrawColumnHeader += new System.Windows.Forms.DrawListViewColumnHeaderEventHandler(this.listView1_DrawColumnHeader);
this.listView1.RetrieveVirtualItem += new System.Windows.Forms.RetrieveVirtualItemEventHandler(this.listView1_RetrieveVirtualItem);
this.listView1.DrawSubItem += new System.Windows.Forms.DrawListViewSubItemEventHandler(this.listView1_DrawSubItem);
两行提供了一些随机文本。 Ownerdrawing很简单:
private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)
{
if (e.ColumnIndex == 0)
{
e.DrawBackground();
e.DrawText();
}
else
e.DrawDefault = true;
//Console.WriteLine("{0}\t\tBounds:{1}\tItem:{2}\tSubitem:{3}", (i++).ToString(), e.Bounds.ToString(), e.Item, e.SubItem);
}
问题是:当我将鼠标悬停在 listview 的内容上时,我得到第一列的闪烁。调试显示 DrawSubItem 在鼠标悬停时不断被调用。
这是错误吗?如何避免这种行为?
【问题讨论】:
-
这是一个老问题,但接受的答案不正确,或者至少在 .NET 4.0 中不正确。检查 ListView 类的 DoubleBuffered protected 属性,可能还有我对this 问题的回答。
-
给出的答案是完全正确的。在 XP 上,如果您有一个虚拟列表并将鼠标悬停在第 0 列上,该控件将闪烁。 DoubleBuffered = true 没有区别。确实,在 Windows 7 上,这个问题不会发生,但这并不会使这个答案不正确。