4

デフォルトの ListView にあまりおかしなバグが見つかりました (所有者が描画したものではありません!)。(例を使用して) アイテムが絶えず追加され、ユーザーが選択したアイテムから少し離れたアイテムを見ようとすると(上または下にスクロール)、大きくちらつきます。Timer

ここで何か間違ったことをしていますか?

これを再現するためのコードを次に示します。

  • WindowsFormsApplication1 を作成します。
  • フォームWindowStateを最大化に設定します。
  • フォーム timer1 に置き、Enabledtrue に設定します。
  • フォーム listView1 に置く:

        this.listView1.Dock = System.Windows.Forms.DockStyle.Fill;
        this.listView1.View = System.Windows.Forms.View.Details;
        this.listView1.VirtualMode = true;
    
  • 列を 1 つ追加します。

  • イベントを追加

        this.listView1.RetrieveVirtualItem += new System.Windows.Forms.RetrieveVirtualItemEventHandler(this.listView1_RetrieveVirtualItem);
    
  • そして最後に

    private void listView1_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
    {
        e.Item = new ListViewItem(e.ItemIndex.ToString());
    }
    
    private void timer1_Tick(object sender, EventArgs e)
    {
        listView1.VirtualListSize++;
    }
    

それを実行して、リストビューのスクロールバーが表示されるまで待ちます(タイマーが十分なアイテムを追加するため)。

  • リストビューの最初のアイテムの 1 つを (マウスまたはキーで)選択し、スクロールバーまたはマウス ホイールを使用して下にスクロールし、選択したアイテムが現在のビューの外 (上) に移動するようにします。下にスクロールすればするほど、ちらつきが激しくなります!そして、スクロールバーが何をしているのか見てください?!?!?

  • 選択したアイテムを下にスクロールすると、同様の効果が現れます。


質問

どうすれば対処できますか?アイデアは、自動スクロールを停止し、上下に移動して近くのイベントを調査する可能性を備えた、一定の更新ログ ウィンドウを用意することです。しかし、そのケック効果では、それは不可能です!

4

4 に答える 4

3

Selected問題は/コンボに関連しているようですFocused(おそらく Microsoft の誰かが確認できます)。

考えられる回避策は次のとおりです(汚いので、嘘をつきます!):

    private void timer1_Tick(object sender, EventArgs e)
    {
        // before adding
        if (listView1.SelectedIndices.Count > 0)
        {
            if (!listView1.Items[listView1.SelectedIndices[0]].Bounds.IntersectsWith(listView1.ClientRectangle))
                listView1.TopItem.Focused = true;
            else
                listView1.Items[listView1.SelectedIndices[0]].Focused = true;
        }
        // add item
        listView1.VirtualListSize++;
    }

トリックは、現在選択されているアイテムが離れているときはいつでも、新しいアイテムを追加する前に確認することです (ここでは確認方法のトピックです)。項目が離れている場合は、TopItem一時的に現在の項目にフォーカスを設定します (ユーザーがスクロールして戻るまで、選択した項目が再び「表示」され、フォーカスが戻るときです)。

于 2013-08-20T16:37:00.887 に答える
0

私はこれが古い投稿であることを知っています.[King King]はすでにダブルバッファの例を示していますが、誰かに役立つ場合は簡単なコードを投稿しています.これにより、アイテムが選択されていてもちらつきがなくなりますが、使用するにはListViewを継承する必要があります.この原因 SetStyle は外部からアクセスできません

C# コード

public class ListViewEX : ListView
{
    public ListViewEX()
    {
        SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
    }
}

VB.NET

Public Class ListViewEX
    Inherits ListView
    Public Sub New()
        SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.OptimizedDoubleBuffer, True)
    End Sub
End Class
于 2016-09-23T11:39:08.210 に答える