我面临一个问题,我需要确定我处理的视觉对象是否实际上对用户可见。
我尝试过的东西(组合),但是我的方法仍然没有完全奏效。
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 的一部分,听起来它肯定对用户不可见。我想知道为什么我没有得到我希望的结果?
你有想法吗?谢谢。