【发布时间】: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 做了什么?它使用类似的过滤器吗?有没有其他更好的选择?
澄清一个简短的描述:
图片中有
- 一个布局容器作为根元素
- 可见的Button1
- Button1 上方是不可见的 Button2
如果我有这样的布局并在 Button2 的绿色区域中单击鼠标,WPF 会跳过 Button2,并且单击事件会出现在 Button1 上。
如果我在没有前面描述的过滤器的情况下进行手动 HitTesting,我将得到 Button2 作为结果。
所以问题是,WPF 使用的默认行为/过滤器是什么?
提前感谢您的任何建议。
【问题讨论】:
-
无法为折叠元素重现此内容。无论如何,这会很奇怪,因为它们不会被布置。
-
哦,你是对的。我会编辑我的问题,我想我用折叠的方式测试了它。对不起。
-
对此有很多解释。但是,您可能会获得一个 .Net 反编译器(如免费的 JetBrains dotPeek)并查看例如的实现。 UIElement.InputHitTest 方法。
-
谢谢,会看看。 :)