gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:05:45 25 4
gpt4 key购买 nike

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

我有几个不同的容器实例相互叠加,我只希望 HitTest 影响当前可见的层,所以我尝试做显而易见的事情,并设置 .IsHitTestVisible=false,这根据到 MSDN 应该防止任何子元素作为命中结果返回。

但是,我仍然在设置为 .IsHitTestVisible=false 的容器上返回命中。我已经尝试了我能想到的所有其他方法,折叠、隐藏、禁用、0 不透明度,似乎没有什么能使它脱离 HitTest 。

最佳答案

我认为这是一个错误。我使用 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));

希望对你有帮助

关于c# - WPF UIElement.IsHitTestVisible=false;仍然返回命中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4813434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com