我从 FrameworkElement 派生一个控件以用作 VisualCollection 的容器,因为我正在使用 DrawingVisuals 进行大量自定义渲染(创建游戏地图)。
我的容器有几个不同的实例,彼此层叠,我只想命中测试影响当前可见的层,所以我尝试做明显的事情,并设置 .IsHitTestVisible=false,根据 MSDN 应该这样做防止任何子元素作为命中结果返回。
但是,我仍然收到设置 .IsHitTestVisible=false 的容器返回的命中。
我已经尝试了我能想到的所有其他方法,折叠,隐藏,禁用,0不透明度,似乎没有什么可以将其从命中测试中剔除。
我认为这是一个错误。我使用 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));
我希望它能帮助你
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)