【问题标题】:Default WPF HitTest behaviour with Hidden/Collapsed elements具有隐藏/折叠元素的默认 WPF HitTest 行为
【发布时间】:2014-08-23 05:03:38
【问题描述】:

在 WPF 中使用VisualTreeHelper.HitTest 时,甚至可以找到隐藏的元素。为了跳过这些元素并只返回可见元素的结果,我创建了一个HitTestFilter,如下所示:

///This Filter should cut all invisible or not HitTest Enabled Elements
private static HitTestFilterBehavior MyHitTestFilter(DependencyObject target)
{
    var uiElement = target as UIElement;
    if (uiElement != null){
        if(!uiElement.IsHitTestVisible || !uiElement.IsVisible))
            return HitTestFilterBehavior.ContinueSkipSelfAndChildren;
    }
    return HitTestFilterBehavior.Continue;
}

这个过滤器完成了他的工作,但我想知道在这种情况下默认的 WPF HitTesting 做了什么?它使用类似的过滤器吗?有没有其他更好的选择?

澄清一个简短的描述:

图片中有

  1. 一个布局容器作为根元素
  2. 可见的Button1
  3. Button1 上方是不可见的 Button2

如果我有这样的布局并在 Button2 的绿色区域中单击鼠标,WPF 会跳过 Button2,并且单击事件会出现在 Button1 上。

如果我在没有前面描述的过滤器的情况下进行手动 HitTesting,我将得到 Button2 作为结果。

所以问题是,WPF 使用的默认行为/过滤器是什么?

提前感谢您的任何建议。

【问题讨论】:

  • 无法为折叠元素重现此内容。无论如何,这会很奇怪,因为它们不会被布置。
  • 哦,你是对的。我会编辑我的问题,我想我用折叠的方式测试了它。对不起。
  • 对此有很多解释。但是,您可能会获得一个 .Net 反编译器(如免费的 JetBrains dotPeek)并查看例如的实现。 UIElement.InputHitTest 方法。
  • 谢谢,会看看。 :)

标签: c# .net wpf hittest


【解决方案1】:

我知道这是一个相当老的问题,但我最近遇到了类似的问题,并通过使用 UIElement.InputHitTest 方法解决了问题。

我换了

HitTestResult hitTest = VisualTreeHelper.HitTest(rootVisual, point);
IInputElement source = hitTest?.VisualHit as IInputElement;

IInputElement source = rootVisual.InputHitTest(point);

第二个版本跳过了不可见的元素(而第一个没有)。

【讨论】:

  • 谢谢!你刚刚救了我的命
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
  • 2014-01-22
  • 2021-10-11
  • 1970-01-01
  • 2022-01-11
  • 2023-02-01
相关资源
最近更新 更多