确定WPF元素相对于某个父级的边界矩形
我认为这是一个非常简单的请求,但我似乎无法在搜索中找到确凿的答案。 如何确定窗口中特定视觉元素相对于其他父元素的边界?
我尝试过使用LayoutInformation.GetLayoutSlot
但这似乎只是在0,0处返回一个Rect
,并不反映元素的实际位置。
我想要做的是使用RenderTargetBitmap
拍摄窗口的“屏幕截图”,然后将其裁剪为特定元素,但我无法获得元素的界限以知道要将位图裁剪为什么!
这很简单:
public static Rect BoundsRelativeTo(this FrameworkElement element, Visual relativeTo) { return element.TransformToVisual(relativeTo) .TransformBounds(LayoutInformation.GetLayoutSlot(element)); }
事实上,将它放在一个单独的方法中可能有点过分。
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)); }
没关系,我终于设法使用LayoutInformation.GetLayoutSlot()
(虽然我可能使用ActualWidth
/ ActualHeight
或RenderSize
)和UIElement.TranslatePoint()
。
当它可以像这样简单时,似乎是一个相当复杂的解决方案:
myElement.GetBounds( relativeElement );
那好吧。 也许有时间进行扩展方法。 🙂
考虑到我在这里找到的一些建议,这解决了我的问题。
item.TransformToVisual( relativeToElement ) .TransformBounds( new Rect( item.RenderSize ) );