我认为这是一个非常简单的请求,但我似乎无法在搜索中找到决定性的答案。如何确定窗口中特定视觉元素相对于其他父元素的边界?
我试过使用LayoutInformation.GetLayoutSlot
,但这似乎只是Rect
在 0,0 处返回 a 并且不反映元素的实际位置。
我正在尝试做的是使用一个窗口的“屏幕截图”,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));
}
考虑到我在这里找到的一些建议,这为我解决了这个问题。
item.TransformToVisual( relativeToElement )
.TransformBounds( new Rect( item.RenderSize ) );
没关系,我终于设法使用LayoutInformation.GetLayoutSlot()
(尽管我可能使用ActualWidth
/ActualHeight
或RenderSize
)和UIElement.TranslatePoint()
.
当它可能像这样简单时,它似乎是一个相当复杂的解决方案:
myElement.GetBounds( relativeElement );
那好吧。也许是时候使用扩展方法了。:)