InputHitTestの挙動について
About
小さなTipsなのでほとんどメモ書きです。マウスイベントから取得した座標などから、対象の座標にあるUIElementを検知する方法にInputHitTestがあります。InputHitTestは引数にとった座標に、UIElementが存在するかどうかを判定するメソッドです。最も上にある要素が戻り値として返されます。例えばCanvas上にEllipseが置かれているとき、Ellipse上の座標を与えるとEllipseが返り、Ellipseから外れたCanvas上の座標を与えるとCanvasが返ります。
HitTestが無効にされているときはInputHitTestの対象となりません。
HitTest自体はあまり利用されることがない機能だと思われます。グラフィカルな操作を必要とするUIを実装する場合にCanvasなどを利用した柔軟な設計が求められますが、そのような場合以外にこの機能を利用することはあまりないでしょう。
Problem
Canvas上などで自由にレイアウトしたいインターフェースを実装する場合には非常に有用な機能なのですが、複雑な実装を必要とする場合には少々問題があります。
InputHitTestの戻り値は対象となるコントロールを構成する最小のコントロール(コンポーネント)となるためです。例を示して端的に解説すると、Labelコントロールに対してInputHitTestを実行する場合、その戻り値はTextBlock(など)となります。多くの場合にはLabelが欲しいでしょうから、子の挙動は問題となる可能性があります。
問題の解決
もしも先の問題例のようにLabelとして取得したい場合には、GetParentなどを利用して親要素を参照する以外に回避策はないようです。