确定WPF元素相对于某个父级的边界矩形

时间:2010-08-12 22:02:34

标签: c# wpf layout bounds rect

我认为这是一个非常简单的请求,但我似乎无法在搜索中找到确凿的答案。如何确定窗口中特定视觉元素相对于其他父元素的界限?

我尝试过使用LayoutInformation.GetLayoutSlot,但这似乎只是在0,0处返回Rect并且没有反映元素的实际位置。

我要做的是使用RenderTargetBitmap拍摄窗口的“屏幕截图”,然后将其裁剪为特定元素,但我无法获取元素的界限以了解裁剪位图的内容到!

4 个答案:

答案 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 / ActualHeightRenderSize)和{{ 1}}。

当它可以像这样简单时,似乎是一个相当复杂的解决方案:

UIElement.TranslatePoint()
好吧,好吧。也许是扩展方法的时间。 :)

答案 3 :(得分:1)

考虑到我在这里找到的一些建议,这解决了我的问题。

item.TransformToVisual( relativeToElement )
    .TransformBounds( new Rect( item.RenderSize ) );