0

HitTestResultCallbackを介してUserControlにアクセスしようとすると問題が発生します。UserControl内のすべてのコントロールを見つけることができますが、UserControlクラスにアクセスする必要があります。コードは次のとおりです。

    public void DragStartInteraction()
    {
        VisualTreeHelper.HitTest(Application.Current.MainWindow, null, new HitTestResultCallback(myCallbackDragStartEvent), new PointHitTestParameters(_currentPoint));

        ...
    }

    private HitTestResultBehavior myCallbackDragStartEvent(HitTestResult result)
    {
        ...

        UserControl el = result.VisualHit as UserControl;

        ...

        return HitTestResultBehavior.Continue;
    }

ありがとう!

4

1 に答える 1

2

HitTestResultCallback、実際にコンテンツをレンダリングしたビジュアルツリー内のビジュアルに対してのみ呼び出されます。たとえば、Labelコントロールでは、コールバックはLabelを構成するBorderとTextBlockのみを返し、Labelコントロール自体は返しません。UserControlについても同じことが言えます。

を呼び出すことにより、HitTestResultCallbackに渡されたビジュアルからUserControlを取得できますVisualTreeHelper.GetParent

または、も提供しHitTestFilterCallbackます。このコールバックは、ビジュアルツリー内のすべてのビジュアルを取得し、UserControlが渡されたときにツリーのトラバースを停止するだけで済みます。

VisualTreeHelper.HitTest(
    Application.Current.MainWindow,
    obj =>
    {
        if (obj is UserControl)
        {
            // found it
            return HitTestFilterBehavior.Stop;
        }
        return HitTestFilterBehavior.Continue;
    },
    result => HitTestResultBehavior.Continue,
    new PointHitTestParameters(_currentPoint));

複数のヒットUserControlを取得したい場合、おそらくテストしているポイントでオーバーラップしているため、またはヒットテストジオメトリでテストしている場合は、を返すことでフィルタリングを続行できますHitTestFilterBehavior.ContinueSkipChildren

于 2013-03-21T19:59:02.867 に答える