0

我面临一个问题,我需要确定我处理的视觉对象是否实际上对用户可见。

我尝试过的东西(组合),但是我的方法仍然没有完全奏效。

1) 如果 Object.IsVisible 为 false,则用户看不到该对象

2)如果我不能转换它,它是不可见的:

                Rect bounds = AssociatedObject.TransformToAncestor(container).TransformBounds(new Rect(0.0, 0.0, AssociatedObject.ActualWidth, AssociatedObject.ActualHeight));
                Rect rect = new Rect(0.0, 0.0, container.ActualWidth, container.ActualHeight);
                if (!rect.Contains(bounds.TopLeft) || !rect.Contains(bounds.BottomRight))
                    return;

就是这个。但是,它不能解决我想要的一种情况:

如果我们有这样的事情:

<Grid>
<Grid Background="Purple" />
<Grid Background="Green" />
</Grid>

我的“对用户可见”算法表明是的,“紫色”网格是可见的。这是正确的,但它不适合我。

我终于手工制作了一些理想的东西,但事实并非如此。它只是不会做正确的事情。

    //last check !!
                        var positionTransform = AssociatedObject.TransformToAncestor(container);
                        var areaPosition = positionTransform.Transform(new Point(0, 0));

                        bool dontcreate = false;
                        VisualTreeHelper.HitTest(AssociatedObject, null, new HitTestResultCallback(
                            delegate(HitTestResult result)
                            {
                                FrameworkElement xs = result.VisualHit as FrameworkElement;
                                if (xs != null)
                            {
                                FrameworkElement cv = VisualHelper.FindChild<FrameworkElement>(AssociatedObject, xs.Name);
                                if (cv == null)
                                {
                                    if (_customPopup != null)
                                    {
                                        ReleasePopupIfNeeded();
                                        dontcreate = true;
                                    }
                                }

                            }
                            return HitTestResultBehavior.Stop;
                        }), new PointHitTestParameters(areaPosition));

                    if (dontcreate)
                        return;

这个想法是,找出VisualObject的坐标。然后使用 Z-Order HitTesting 接收坐标上的第一个元素。如果该对象不是 VisualObject 或 VisualObject 的一部分,听起来它肯定对用户不可见。我想知道为什么我没有得到我希望的结果?

你有想法吗?谢谢。

4

0 回答 0