默认情况下,WPF在进行HitTest时会忽略Hidden/Collapsed元素。

8

在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使用的默认行为/过滤器是什么?
感谢任何建议。

1
无法重现折叠元素的问题。而且,这本来就很奇怪,因为它们不会被布局。 - Clemens
哦,你说得对。我会编辑我的问题,我以为我已经测试过它了,但很抱歉,我错了。 - sebhaub
关于这个问题有很多需要解释的地方。不过你可以使用 .Net 反编译器(比如免费的 JetBrains dotPeek)来查看例如 UIElement.InputHitTest 方法的实现。 - Clemens
谢谢,我会查看一下。 :) - sebhaub
3
可能是与此问题重复:WPF UIElement.IsHitTestVisible=false; still returning hits? - torvin
1个回答

10

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

我替换了

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

随着

IInputElement source = rootVisual.InputHitTest(point);
第二个版本跳过不可见元素(而第一个版本没有)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接