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

前端之家收集整理的这篇文章主要介绍了c# – WPF UIElement.IsHitTestVisible = false;仍然返回命中?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我从FrameworkElement派生一个控件,用作VisualCollection的容器,因为我正在使用DrawingVisuals(创建游戏图)进行大量的自定义渲染.

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

但是,我仍然在设置的容器上返回命中.IsHitTestVisible = false.
我已经尝试过一切我可以想到的,折叠,隐藏,残疾,0不透明度,似乎没有把它从命中测试.

解决方法

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

我的解决方案是使用过滤器的HitTest:

  1. public static HitTestFilterBehavior HitTestFilterInvisible(DependencyObject potentialHitTestTarget)
  2. {
  3. bool isVisible = false;
  4. bool isHitTestVisible = false;
  5.  
  6. var uiElement = potentialHitTestTarget as UIElement;
  7. if (uiElement != null)
  8. {
  9. isVisible = uiElement.IsVisible;
  10. if (isVisible)
  11. {
  12. isHitTestVisible = uiElement.IsHitTestVisible;
  13. }
  14. }
  15. else
  16. {
  17. UIElement3D uiElement3D = potentialHitTestTarget as UIElement3D;
  18. if (uiElement3D != null)
  19. {
  20. isVisible = uiElement3D.IsVisible;
  21. if (isVisible)
  22. {
  23. isHitTestVisible = uiElement3D.IsHitTestVisible;
  24. }
  25. }
  26. }
  27.  
  28. if (isVisible)
  29. {
  30. return isHitTestVisible ? HitTestFilterBehavior.Continue : HitTestFilterBehavior.ContinueSkipSelf;
  31. }
  32.  
  33. return HitTestFilterBehavior.ContinueSkipSelfAndChildren;
  34. }
  35. ...
  36. // usage:
  37.  
  38. VisualTreeHelper.HitTest(
  39. myHitTestReference,HitTestFilterInvisible,hitTestResult =>
  40. {
  41. // code to handle element which is visible to the user and enabled for hit testing.
  42. },new PointHitTestParameters(myHitTestPoint));

我希望它能帮助你

猜你在找的C#相关文章