WPF UIElement.IsHitTestVisible = false; 还在回击?

Kal*_*rak 10 c# wpf

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

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

但是,我仍然在设置的容器上返回命中.IsHitTestVisible = false.我已经尝试了我能想到的所有其他东西,折叠,隐藏,禁用,0不透明,似乎没有任何东西可以把它从命中测试中拿出来.

Mar*_*nov 13

我认为这是一个错误.我使用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));
Run Code Online (Sandbox Code Playgroud)

我希望它会对你有所帮助

  • 我在滚动查看器模板的边框上遇到了同样的问题...我在底部有一个边框,它创建了一个小"提示"阴影,因此用户知道内容是可滚动的,但是边框阻止了鼠标事件从它下面的内容...我已经在边框上设置IsHitTestVisible ="false"但它仍然获得鼠标事件.不幸的是我没有处理文件背后的任何代码所以我无法覆盖命中测试方法......任何想法? (2认同)