HitTest结果不会调用Callback

时间:2012-01-07 21:24:44

标签: .net wpf tree hittest

您好我有以下代码,过滤器回调被调用,但结果回调没有,我已经看了一段时间,任何帮助将不胜感激。

   public HitTestFilterBehavior MyHitTestFilter(DependencyObject o)
   {
        s += o.ToString() + " ";
        //Test for the object value you want to filter.
        if (o.GetType() != typeof(Node))
        {
            // Visual object and descendants are NOT part of hit test results enumeration.
            return HitTestFilterBehavior.ContinueSkipSelf;
        }
        else
        {
            s+="node detected ";
            // Visual object is part of hit test results enumeration.
            return HitTestFilterBehavior.Continue;
        }
    }

以下是结果回调的代码:

public HitTestResultBehavior MyHitTestResult(HitTestResult result)
{
       s += "in result callback ";
       if (result.VisualHit.GetType() == typeof(Node))
        {
            hitResultsList.Add(result.VisualHit as Node);
            s+= "node detected in result callback "
            return HitTestResultBehavior.Stop;

        }
        return HitTestResultBehavior.Continue;
 }

以下是我如何调用命中测试:

 hitResultsList.Clear();
        VisualTreeHelper.HitTest(designerCanvas, new HitTestFilterCallback(MyHitTestFilter), new HitTestResultCallback(MyHitTestResult), new PointHitTestParameters(End));

现在,过滤器回调遍历所有元素并找到节点,但结果回调根本不会被调用。

1 个答案:

答案 0 :(得分:2)

关于“视觉层中的命中测试”的MSDN文档包含奇怪的注释“在未调用命中测试结果回调的情况下,有时会调用命中测试过滤器回调。”没有进一步解释原因:http://msdn.microsoft.com/en-us/library/ms752097.aspx#using_a_hit_test_filter_callback

这是因为afaik为整个可视树(designerCanvas)调用了过滤器回调,而结果回调仅针对那些真正被PointHitTestParameters命中的视觉效果调用。

如果你真的只想找到第一个节点(当它找到时返回HitTestResultBehavior.Stop),你无论如何都不需要过滤。

尝试省略过滤器回调以查看Node是否真的被击中。呼叫

VisualTreeHelper.HitTest(designerCanvas, null, MyHitTestResult, new PointHitTestParameters(End));