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();
}
每当它为物品着色时,它就会闪烁。 我看到了一些答案,但没有一个在起作用。
我看到了这个答案:
这一个
也许我没有正确使用它们。但他们没有用。
尝试将其添加到底部的form1:
protected override CreateParams CreateParams {
get {
var parms = base.CreateParams;
parms.Style &= ~0x02000000; // Turn off WS_CLIPCHILDREN
return parms;
}
}
然后,每当项目在事件中着色时,尝试创建此实例。
答案 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);
}
}
}