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

dev*_*os1 16 c# wpf layout rect bounds

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

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

我正在尝试做的是使用窗口的"屏幕截图",RenderTargetBitmap然后将其裁剪为特定元素,但我无法获得元素的界限,知道要将位图裁剪为什么!

Ray*_*rns 20

这很简单:

public static Rect BoundsRelativeTo(this FrameworkElement element,
                                         Visual relativeTo)
{
  return
    element.TransformToVisual(relativeTo)
           .TransformBounds(LayoutInformation.GetLayoutSlot(element));
}
Run Code Online (Sandbox Code Playgroud)

事实上,将它放在一个单独的方法中可能有点过分.

  • `GetLayoutSlot`获取在元素布局中分配的空间,但如果它具有明确的宽度/高度和/或变换,则实际元素大小可能不同.要获得"true"大小rect,请尝试`element.RenderTransform.TransformBounds(new Rect(element.RenderSize))`. (6认同)

Dan*_*anW 5

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));
    }
Run Code Online (Sandbox Code Playgroud)


Mau*_*tro 5

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

item.TransformToVisual( relativeToElement )
    .TransformBounds( new Rect( item.RenderSize ) );
Run Code Online (Sandbox Code Playgroud)