wpf命中测试

时间:2012-10-08 14:26:37

标签: wpf testing hit

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

我尝试过的事情(合并),但我的方法仍然没有完全发挥作用。

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的PART,那么它确实听起来像用户不可见。我想知道为什么我没有得到结果我希望?

你有想法吗? 感谢。

0 个答案:

没有答案