无法让ListView停止闪烁

时间:2014-02-18 23:29:40

标签: c# .net multithreading listview

C#.Net 4.5

我有一个ListView,它通过这种方法不断被不同的线程更新:

public void UpdateUI_List_SetRow(int rowNum, ListViewItem item)
{
    lock (lock_List)
    {
        try
        {
            if (this.lstStatus.InvokeRequired)
                lstStatus.Invoke(new MethodInvoker(() => lstStatus.Items[rowNum] = item));
            else
                lstStatus.Items[rowNum] = item;
        }
        catch (Exception ex)
        {
            ErrorLogging.Log(ex);
        }
    }
}

在更新时不断闪烁。我尝试过DoubleBuffered修复(How to prevent flickering in ListView when updating a single ListViewItem's text?),但它没有用。

很抱歉,如果这是一个重复的帖子,但除了启用双缓冲之外,我找不到任何其他解决方案。

2 个答案:

答案 0 :(得分:3)

要启用双缓冲的子类ListView:

namespace System.Windows.Forms
{
    public class ListViewEx : ListView
    {
        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.ExStyle |= 0x02000000;  // Turn on WS_EX_COMPOSITED
                return cp;
            }
        }
    }
}

答案 1 :(得分:2)

接受的答案中提供的代码有效,但破坏了选择矩形。下面的解决方案就像一个魅力。它启用双缓冲并保留正确的矩形。

public partial class myListView : ListView
{
    public myListView()
    {
        SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
    }
}

如何使用 - 将此代码添加到您的命名空间并使用 myListView 而不是传统的 ListView。

enter image description here