そのため、ユーザーが複数のアイテムを選択できるようにツリー ビューを拡張しましたが、ランダムに描画を停止する小さなバグに遭遇しました。
いろいろ調べてみたところ、問題の原因は 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);
}