我正面临一个问题,我需要决定处理的视觉对象是否实际上对用户可见。
我尝试过的事情(合并),但我的方法仍然没有完全发挥作用。
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,那么它确实听起来像用户不可见。我想知道为什么我没有得到结果我希望?
你有想法吗? 感谢。