2017-02-12 12 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

そして、この1

Flickering answer

たぶん私は右のそれを使用していませんでした。しかし、彼らは働かなかった。

は下部にForm1にこれを追加しようとしました:

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

は、次に、この項目は、イベント内部着色された各時間インスタンスを作成しようとしました。

+3

方法は、再帰を経由して勝つのフォーム(Windowsの場合)によって自動的に呼び出され、あなたはそれを呼び出すために持っていけません。 1項目の色を変えるだけで何がちらつきますか?全体のリストボックスまたはアイテム?私はリストボックスの開始時に 'SuspendLayout()'を呼び出し、ダウンロードメソッドの最後に 'Resresh()'を再開します。 – Tatranskymedved

+1

大部分のダウンロードがかなり速く完了するこの状況は状況に影響しませんか?これは現実的な状況ですか? – MickyD

答えて

2

私はあなたの問題を抱えていましたし、いくつかの調査を行った後、ListViewコントロールは、単一項目を変更するたびに領域全体を塗り直すように見えます。解決方法は、ListViewをサブクラス化し、WM_ERASEBKGNDメッセージをフィルタ処理することです。これは私のためのトリックでした。

詳細についてはこちらを参照してください。最後にdesribed 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

関連する問題