更新项目时有没有办法避免listView闪烁?

时间:2017-02-12 00:41:50

标签: c# .net winforms

private void downloader_Succeeded(object sender, EventArgs e)
        {
            FileDownloader.FileInfo fi = downloader.CurrentFile;
            string name = fi.Path;
            foreach (ListViewItem lvw in listView1.Items)
            {
                if (lvw.Text == name)
                    lvw.ForeColor = Color.Green;
            }
            label6.Text = countFilesDownloaded++.ToString();
        }

每当它为物品着色时,它就会闪烁。 我看到了一些答案,但没有一个在起作用。

我看到了这个答案:

Flickering answer

这一个

Flickering answer

也许我没有正确使用它们。但他们没有用。

尝试将其添加到底部的form1:

protected override CreateParams CreateParams {
  get {
    var parms = base.CreateParams;
    parms.Style &= ~0x02000000;  // Turn off WS_CLIPCHILDREN
    return parms;
  }
}

然后,每当项目在事件中着色时,尝试创建此实例。

1 个答案:

答案 0 :(得分:3)

我遇到了你的问题,经过一些研究后,只要修改单个项目,ListView控件就会重新绘制整个区域。解决方案是将ListView子类化并过滤掉WM_ERASEBKGND消息。这对我有用。

有关详细信息,请参阅此处: c# flickering Listview on update

public partial class ListViewNF : ListView
{
    public ListViewNF()
    {
    }

    public ListViewNF(IContainer container)
    {
        container.Add(this);

        InitializeComponent();

        //Activate double buffering
        this.SetStyle(ControlStyles.OptimizedDoubleBuffer |  
        ControlStyles.AllPaintingInWmPaint, true);

        //Enable the OnNotifyMessage event so we get a chance to filter out 
        // Windows messages before they get to the form's WndProc
        this.SetStyle(ControlStyles.EnableNotifyMessage, true);
    }

    protected override void OnNotifyMessage(Message m)
    {
        //Filter out the WM_ERASEBKGND message
        if (m.Msg != 0x14)
        {
            base.OnNotifyMessage(m);
        }
    }
}