2012-01-07 72 views
0

嗨我有下面的代码,过滤器回调被调用,但结果回调没有,我一直在看这个一段时间,任何帮助,将不胜感激。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

关于“在可视层中进行命中测试”的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)); 
+0

感谢您的答复,我觉得你的解释,使测试,而不是说得到了由试打的视觉效果,这是因为过滤器经过整棵树整个视觉树的感觉,在这里因为没有过滤器,结果回调仅返回返回两个视觉效果。顺便说一下,结果回调不捕捉节点,所以我用过滤器回调。 – mihajlv 2012-01-08 19:12:31