同じキャンバスに複数のコントロールがあり、1つが別のコントロールで覆われている可能性があります。それらはすべて同じzIndexを持っていますが、ロードされた順序については、いくつかは上に、他は下になっています。AcontrolがBcontrolを超えているかどうかの質問です。クリックしましたが、クリックイベントを取得するのはAだけです。Bにもイベントを取得させるにはどうすればよいですか?ありがとう。
2 に答える
後ろのコントロールだけでイベントを取得したい場合は、最初のコントロールの前にあるすべてのコントロールについて、イベントを取得するために後ろのコントロールを設定する必要がありますがIsHitTestVisible = False
、これは必要なことではありません。
それらすべてにイベントを取得させたい場合は、UI全体を要素のツリーと考えてください。あなたが話しているこれらのコントロールはすべて兄弟です。何かがクリックされると、親が最初に通知を受け取り、クリックを処理しない場合は、そのマウスの位置でその親の表示されている子要素に渡され、処理されるまで続きます。クリックされた子がマウスクリックを処理しないようにする唯一の方法は、すべての兄弟の共通の親に最初にイベントを処理させることです。
次に、親のハンドラーで何か巧妙なことをして、マウスの下にあるすべての子要素のクリックイベントを呼び出す必要があります。問題は、フレームワークがマウスの下にあるコントロールを決定するという大変な作業を行っていたのに対し、 、あなたは今、その大変な仕事をしなければならないでしょう。
チャンスは無い。MouseClick を未処理としてマークしても、兄弟ではなく親要素 (Canvas) にルーティングされます。唯一の方法は、ヒット テストです。ユーザーが Acontrol をクリックすると、ヒット テストを実行して、その下に別のコントロールがあるかどうかを判断する必要があります。
コールバックでヒット テストを使用する必要があります。これにより、Acontrol をスキップして Bcontrol を見つけることができます。見つかった場合は、Bcontrol がクリックされたものとして扱うことができます。