我从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)
我希望它会对你有所帮助
| 归档时间: |
|
| 查看次数: |
5957 次 |
| 最近记录: |