【发布时间】:2010-12-09 22:34:29
【问题描述】:
我有一个画布,它的 VisualCollection 中有子 DrawingVisuals。我想对某种类型的孩子进行测试,而不是对其他类型的孩子进行测试。为此,我编写了 HitTestFilterCallback 函数:
public HitTestFilterBehavior MyHitTestFilter(DependencyObject o)
{
Debug.WriteLine(o.GetType());
if (o is BackgroundLine)
{
return HitTestFilterBehavior.ContinueSkipSelf;
}
else
{
return HitTestFilterBehavior.Continue;
}
}
所以我检查canvas的孩子是否是一个BackgroundLine,它是从DrawingVisual派生的,如果是我跳过它。但是,我从 Debug.WriteLine(o.GetType()) 获得的类型只是 System.Windows.Media.DrawingVisual。有没有办法找到最具体的对象类型?
其余代码如下。我只想针对 GraphicsBase 对象进行测试。
GraphicsBase hit = null;
public HitTestResultBehavior MyHitTestResult(HitTestResult result)
{
hit = (GraphicsBase)result.VisualHit;
return HitTestResultBehavior.Stop;
}
VisualTreeHelper.HitTest(drawingCanvas, new HitTestFilterCallback(MyHitTestFilter),
new HitTestResultCallback(MyHitTestResult), new PointHitTestParameters(point));
if (hit != null)
Debug.WriteLine("hit");
else
Debug.WriteLine("nothing");
【问题讨论】:
-
你能分享一个调用
MyHitTestFilter的代码吗? -
BackgroundLine 是从什么派生而来的?
-
BackgroundLine 和 GraphicsBase 都是从 DrawingVisual 派生的。 drawingCanvas 仅包含这 2 个类的对象。
-
这可能是您向画布添加视觉效果的方式的问题,因为我在 HitTestFilterCallback 和 HitTestResultCallback 中都得到了正确的类型。