0

そのため、ユーザーが複数のアイテムを選択できるようにツリー ビューを拡張しましたが、ランダムに描画を停止する小さなバグに遭遇しました。

いろいろ調べてみたところ、問題の原因は MouseDown および MouseUp イベントであることが実際にわかりました。

    protected override void OnMouseDown(MouseEventArgs e)
    {
        BeginUpdate();
        base.OnMouseDown(e);
    }

    protected override void OnMouseUp(MouseEventArgs e)
    {
        EndUpdate();
        base.OnMouseUp(e);
    }

そのため、ユーザーが TreeView 内をクリックして、その外で離した場合、MouseUp イベントは呼び出されず、更新は終了しません。そこまではわかるのですが、その後、何回ボックスをクリックしても、EndUpdate() が呼び出されているにもかかわらず、描画が開始されないのが不思議です。これは、EndUpdate() を含むボタンを追加することで解決できますが、明らかにそれは望ましくありません。

これが必要な理由は、ノードと選択したノードの色付けを手動で管理しているため、通常の選択イベントはすべて実際にキャンセルされるからです。しかし、Begin と End の更新がないと、キャンセルに到達する前に選択ボックスがちらつきます。これらを使用すると、ちらつきは発生しませんが、コストがかかるようです。

これは、問題を示す空のプロジェクトへのドロップボックス リンクです。 最後の更新で中断すると、それが呼び出されていることがわかりますが、何も変わっていないようです。しかし、同じコードを呼び出すボタンをクリックすると、それが解決されます。

なぜこれが起こっているのか誰でも説明できますか?私はひどく明白な何かを見逃していますか? それとも、これは一般的にそれを行うには悪い方法ですか?

よろしく。

回答: 回答が提出されていないため、Hans Passant によって私の注意を引いた解決策を次に示します。私はこれを思いつかなかったので、自分で投稿して回答としてマークしたくありませんでした。これを拡張 TreeView クラスに追加すると、すべての問題が解決されたようです。(おそらくいくつかの悪い呼び出しを行うことになりますが、無駄であることに加えて、何も害を及ぼすようには見えません)。

    protected override void OnMouseCaptureChanged(EventArgs e)
    {
        EndUpdate();
        base.OnMouseCaptureChanged(e);
    }
4

0 に答える 0