1

ほとんどがTreeViewer. これはContentOutlinePage、アウトライン ビューに命を吹き込むために に接続されています。

どちらかが a を受け取るSelectionChangedEventと、他のメソッドを呼び出しsetSelection()ます...そしてそこに問題があります。setSelection()別のSelectionChangedEvent...が生成され、無限ループが結合されます。

SelectionChangedEventが別のオブジェクトの呼び出しではなく、実際のユーザーの操作によって作成されたかどうかを判断する手段はありますsetSelection()か?

この種の致命的な抱擁を止めるためのより良い手段はまだありますか?

手がかりを歓迎します。

4

2 に答える 2

3

通常、ルーチンの開始時にフラグをチェックして、イベント ハンドラの途中にいるかどうかを確認します。フラグが設定されている場合は、処理せずに終了します。

フラグが設定されていない場合は、フラグを設定して処理し、フラグを元に戻します。

于 2009-01-28T16:07:27.467 に答える
0

機能する別のパターンは、イベント リスナーを削除し、選択を行い、イベント リスナーを再度追加することです。これにより、これについて心配しなければならないコード内の場所が 1 つだけになります。フラグを使用すると、2 つの場所を同時に維持する必要があります。

また、SelectionChangedChanged はおそらく (確実ではありませんが) イベント スタックの一番上に配置されます (つまり、非同期で実行されます)。その場合、ビューアが通知を伝達しない期間も最小限に抑えます。

全体として、マウスがクリックされたかどうかに関係なく、生成された SelectionChangedEvent が同じであることは残念です。それを実現するのは、人が期待するほど簡単ではないと思います。テキスト エディター クラスを共有するために、テキスト エディター クラスの動作を変更して、2 種類の挿入イベント (ユーザー生成およびネットワーク生成) を新しくする必要がありました。これについての議論をもっと見たいです。

于 2009-02-13T08:08:13.213 に答える