18

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

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

我正在尝试做的是使用一个窗口的“屏幕截图”,RenderTargetBitmap然后将其裁剪为特定元素,但我无法让元素的边界知道将位图裁剪到什么!

4

4 回答 4

21

这很简单:

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

事实上,将它放在一个单独的方法中可能是矫枉过正。

于 2010-08-13T05:35:45.923 回答
8

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));
    }
于 2016-01-11T15:54:44.680 回答
5

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

item.TransformToVisual( relativeToElement )
    .TransformBounds( new Rect( item.RenderSize ) );
于 2018-01-08T10:54:39.443 回答
1

没关系,我终于设法使用LayoutInformation.GetLayoutSlot()(尽管我可能使用ActualWidth/ActualHeightRenderSize)和UIElement.TranslatePoint().

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

myElement.GetBounds( relativeElement );

那好吧。也许是时候使用扩展方法了。:)

于 2010-08-12T22:23:34.377 回答