您好我有以下代码,过滤器回调被调用,但结果回调没有,我已经看了一段时间,任何帮助将不胜感激。
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));
现在,过滤器回调遍历所有元素并找到节点,但结果回调根本不会被调用。
答案 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));