0

これはWPFアプリケーションです。

私はマウスの真下でコントロールを取得しようとしていますが、それは驚くべき苦痛であることが証明されています。

Mouse.DirectlyOver、InputHitTest、およびVisualTreeHelper.HitTestはすべて、VISUALツリーを参照します。コントロール自体を取得しようとしています。

例:TextBoxがあり、上記のいずれかを使用すると、TextBoxViewが返されますが、TextBox自体が必要です。

これは、PreviewLeftButtonDownイベント内で発生しています。Senderは常にListViewItemであるため、Senderはオプションではありません。e.OriginalSourceを確認すると、それはまだVisualTree要素であり、実際のコントロールではありません。

必要に応じて、さらに説明させていただきます。

ありがとう

4

3 に答える 3

4

必要なタイプが見つかるまで、ビジュアルツリーを上に移動する必要があります。ここにいくつかのコードへのリンクがあります。

これがそのリンクからのコードです

// walk up the visual tree to find object of type T, starting from initial object
public static T FindUpVisualTree<T>(DependencyObject initial) where T : DependencyObject
{
    DependencyObject current = initial;

    while (current != null && current.GetType() != typeof(T))
    {
         current = VisualTreeHelper.GetParent(current);
    }
    return current as T;   
}
于 2013-03-06T20:31:37.087 に答える
1

UIElement:が見つかるまでビジュアルツリーを上に移動します。

public UIElement FindUIElement(DependencyObject visualTreeNode)
{
    UIElement elem;
    while ((elem = (visualTreeNode as UIElement)) != null)
        visualTreeNode = VisualTreeHelper.GetParent(visualTreeNode);
    return elem;
}
于 2013-03-06T20:59:40.237 に答える
1

私はmdm20に同意します。そこにたどり着く唯一の方法Textboxは、親までトラバースすることです。実際、ここに数年前に尋ねられた同じ質問へのリンクがあり、同じ答えがあります。不要なツリートラバーサルを制限したい場合は、をヒットすると検索を停止できますListViewItem。そのポイントより上のものは、とにかく探しているものではないためです。

ただし、最後のリンクとこれを一緒に追加すると、実際にはすでに答えがあるように見えます。aTextBoxViewが返された場合は、テキストボックスがヒットしたことがわかります。TextBox潜在的に通過する着信をキャッシュすることもできますがHitTestFilterCallBack、それは理論であり、バグが発生しやすい可能性があります。TextBoxただし、そのパスをたどると、フィルターを通過するのが親であるかどうかをテストできます。TextBoxView

于 2013-03-07T01:53:13.907 に答える