2017-02-12 71 views
-1
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(); 
     } 

每一次它着色的項目閃爍。 我看到了一些答案,但他們都沒有工作。更新項目時有什麼辦法可以避免listView閃爍?

我看到了這樣的回答:

Flickering answer

而這一次

Flickering answer

也許我沒有使用他們的權利。但他們沒有工作。

此次嘗試在底部添加到Form1:

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

然後嘗試這個創建實例每次項目是該事件中的着色。

+3

到底desribed的方法是通過遞歸通過贏形式(Windows)中自動調用,你不必調用。如果你只是改變1項的顏色,什麼是閃爍?整個列表框或項目?我會考慮在下載方法 – Tatranskymedved

+1

結束時在列表框中調用「SuspendLayout()」,並在其下載「Refresh()」時,這種問題不會在多數情況下完成嗎?這是一個現實的情況嗎? – MickyD

回答

2

我有你的問題,並做了一些研究後,似乎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); 
     } 
    } 
} 
+0

如果調整窗口大小,會發生什麼情況?有時候控件最終會在自己上面繪畫 – MickyD

+0

@MickyD - 在重新調整大小時不會發生重新繪畫或輕彈。我的ListView類使用多種顏色來爲某些列表項目的背景添加顏色以及顏色。 –

+0

真棒好先生。 +1 – MickyD