3

我有一个 System.Windows.Forms.ListView 包含许多项目。它闪烁得令人无法忍受(似乎经常发生这种情况),所以经过一番搜索后,我决定在“ListViewLessFlicker”类中做这两件事。

        this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
        this.SetStyle(ControlStyles.Opaque, true);

尽管 DoubleBuffering 在这些主题中最常作为解决方案给出,但它并没有太大的效果,但是将样式 opaque 设置为 true 极大地减少了闪烁。
http://www.virtualdub.org/blog/pivot/entry.php?id=273

然而,它有一个副作用,我似乎无法找到解决办法。当我将鼠标悬停在 ListView 中的某个项目上时,它现在会使文本变得粗体并且非常模糊(除非 opaque 为真,否则不会发生这种情况)。

这是一个非常放大的例子。

在此处输入图像描述

如果有人有修复或知道它为什么会这样做,我很想知道!

4

2 回答 2

5

我通常这样做 - 调整控件大小时减少闪烁。批量添加项目时,您需要使用BeginUpdate()/EndUpdate()来减少闪烁。我不知道是什么可能导致模糊,所以我不能就此提出建议 - 更新您的视频驱动程序可能会有所帮助,但不要抱太大希望。

[System.ComponentModel.DesignerCategory ( "" )]
public partial class ListViewEx : ListView
{
    private const int WM_ERASEBKGND = 0x14;

    public ListViewEx ()
    {
        InitializeComponent ();

        // Turn on double buffering.
        SetStyle ( ControlStyles.OptimizedDoubleBuffer |
            ControlStyles.AllPaintingInWmPaint, true );

        // Enable the OnNotifyMessage to filter out Windows messages.
        SetStyle ( ControlStyles.EnableNotifyMessage, true );
    }

    protected override void OnNotifyMessage ( Message oMsg )
    {
        // Filter out the WM_ERASEBKGND message to prevent the control
        // from erasing the background (and thus avoid flickering.)
        if ( oMsg.Msg != WM_ERASEBKGND )
            base.OnNotifyMessage ( oMsg );
    }
}
于 2012-09-28T10:55:50.203 回答
3

我和你有同样的问题,我在这个页面的评论中找到了解决方案:http: //www.virtualdub.org/blog/pivot/entry.php?id=273

您必须像这样创建新类:

public class BufferedListView : ListView
{
    public BufferedListView() : base()
    {
        SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
    }
}

然后将您的 ListView 定义为 BufferedListView ,如下所示:

ListView myListView = new BufferedListView();

在那之后,模糊的文字不再是问题;)

于 2012-11-27T20:54:20.547 回答