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?),但它没有用。
很抱歉,如果这是一个重复的帖子,但除了启用双缓冲之外,我找不到任何其他解决方案。
答案 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。