c# – WPF UIElement.IsHitTestVisible = false;仍然返回命中?

我从FrameworkElement派生一个控件,用作VisualCollection的容器,因为我正在使用DrawingVisuals(创建游戏图)进行大量的自定义渲染.

我有几个不同的我的容器的实例分层在彼此之上,我只想要命中测试影响当前可见的层,所以我尝试做明显的,并设置.IsHitTestVisible = false,根据MSDN应该防止任何子元素作为命中结果返回.

但是,我仍然在设置的容器上返回命中.IsHitTestVisible = false.
我已经尝试过一切我可以想到的,折叠,隐藏,残疾,0不透明度,似乎没有把它从命中测试.

解决方法

我认为这是一个bug.我使用Reflector来了解为什么HitTest方法返回不可见的项目,我发现没有检查可见性.

我的解决方案是使用过滤器的HitTest:

public static HitTestFilterBehavior HitTestFilterInvisible(DependencyObject potentialHitTestTarget)
{
    bool isVisible = false;
    bool isHitTestVisible = false;

    var uiElement = potentialHitTestTarget as UIElement;
    if (uiElement != null)
    {
        isVisible = uiElement.IsVisible;
        if (isVisible)
        {
            isHitTestVisible = uiElement.IsHitTestVisible;
        }
    }
    else
    {
        UIElement3D uiElement3D = potentialHitTestTarget as UIElement3D;
        if (uiElement3D != null)
        {
            isVisible = uiElement3D.IsVisible;
            if (isVisible)
            {
                isHitTestVisible = uiElement3D.IsHitTestVisible;
            }
        }
    }

    if (isVisible)
    {
        return isHitTestVisible ? HitTestFilterBehavior.Continue : HitTestFilterBehavior.ContinueSkipSelf;
    }

    return HitTestFilterBehavior.ContinueSkipSelfAndChildren;
}
...
// usage:

    VisualTreeHelper.HitTest(
        myHitTestReference,HitTestFilterInvisible,hitTestResult =>
        {
            // code to handle element which is visible to the user and enabled for hit testing.
        },new PointHitTestParameters(myHitTestPoint));

我希望它能帮助你

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...