2014-02-18 111 views
1

C#.NET 4.5無法獲得的ListView停止閃爍

我有一個不斷被不同的線程通過這種方法更新一個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

如果你的更新速度太快,也許你可以寫你的速度快,後臺更新一些收藏。然後每500毫秒到1000毫秒更新您的基於該集合的ListView。 – Brad

+0

..並且調用'SuspendLayout'和'ResumeLayout'也可能有幫助。 –

+0

suspendlayout沒有什麼區別。呃...guess我必須嘗試重新編碼它,看看它是否有所作爲:( – blizz

回答

2

子類的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; 
      } 
     } 
    } 
} 
+0

你能詳細說明這裏發生了什麼更多? – Brad

+0

這是否啓用了不同的雙緩衝機制,而不是我在我提供的鏈接問題? – blizz

+0

ListView的實現方式很差,每次添加或刪除一個項目時都會重新繪製整個客戶區域,導致閃爍,而這反過來也會使背景無效,這就是您經歷閃爍的原因。 – JonPall