我认为这是一个非常简单的请求,但我似乎无法在搜索中找到确凿的答案。如何确定窗口中特定视觉元素相对于其他父元素的界限?
我尝试过使用LayoutInformation.GetLayoutSlot
,但这似乎只是在0,0处返回Rect
并且没有反映元素的实际位置。
我要做的是使用RenderTargetBitmap
拍摄窗口的“屏幕截图”,然后将其裁剪为特定元素,但我无法获取元素的界限以了解裁剪位图的内容到!
答案 0 :(得分:18)
这很简单:
public static Rect BoundsRelativeTo(this FrameworkElement element,
Visual relativeTo)
{
return
element.TransformToVisual(relativeTo)
.TransformBounds(LayoutInformation.GetLayoutSlot(element));
}
事实上,将它放在一个单独的方法中可能有点过分。
答案 1 :(得分:4)
LayoutSlot选项根本不适用于我。 这最终给了我一个相对于指定的父/祖先控制的子位置:
public static Rect BoundsRelativeTo(this FrameworkElement child, Visual parent)
{
GeneralTransform gt = child.TransformToAncestor(parent);
return gt.TransformBounds(new Rect(0, 0, child.ActualWidth, child.ActualHeight));
}
答案 2 :(得分:3)
没关系,我终于设法使用LayoutInformation.GetLayoutSlot()
的组合来解决这个问题(虽然我可能使用了ActualWidth
/ ActualHeight
或RenderSize
)和{{ 1}}。
当它可以像这样简单时,似乎是一个相当复杂的解决方案:
UIElement.TranslatePoint()
好吧,好吧。也许是扩展方法的时间。 :)
答案 3 :(得分:1)
考虑到我在这里找到的一些建议,这解决了我的问题。
item.TransformToVisual( relativeToElement )
.TransformBounds( new Rect( item.RenderSize ) );