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

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

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

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

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

我的解决方案是使用带filter的重载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)); 

我希望它会对你有所帮助