【问题标题】:WPF - Hit Test Filter CallbackWPF - 命中测试过滤器回调
【发布时间】: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 中都得到了正确的类型。

标签: wpf callback hittest


【解决方案1】:

我发现了问题。我看到的 DrawingVisual 对象是我为背景颜色添加的矩形。我忘记了这一点,并认为我将 BackgroundLine 对象的类型设为 DrawingVisual。正如 rooks 所说,我可以得到特定的 BackgroundLine 类型。谢谢。

【讨论】:

    猜你喜欢
    • 2020-01-05
    • 2018-01-27
    • 2018-09-28
    • 2023-03-10
    • 2011-10-19
    • 1970-01-01
    • 2013-02-06
    • 2017-03-30
    • 2021-08-28
    相关资源
    最近更新 更多