我认为这是一个非常简单的请求,但是我在搜索中似乎找不到确定的答案。如何确定窗口中特定可视元素相对于其他父元素的边界?
我尝试使用LayoutInformation.GetLayoutSlot
,但这似乎只返回0,0处的Rect
,并未反映元素的实际位置。
我想要做的是使用RenderTargetBitmap
对窗口进行“屏幕截图”,然后将其裁剪到特定的元素,但我无法获取元素的边界以知道要将位图裁剪到哪里!
这很简单:
public static Rect BoundsRelativeTo(this FrameworkElement element,
Visual relativeTo)
{
return
element.TransformToVisual(relativeTo)
.TransformBounds(LayoutInformation.GetLayoutSlot(element));
}
实际上,将其放入单独的方法中可能有些过度。
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 );
嗯,也许是时候使用扩展方法了。:)
myElement.PointToScreen(new Point())
将所有内容转换为屏幕坐标,这对于处理WM_NCHITTEST来说还可以。但我仍然认为这是一种hack方法。 - ygoeTranslatePoint
的文档。 - devios1
GetLayoutSlot
方法获取布局中为元素分配的空间,但如果该元素具有显式宽度/高度和/或转换,则实际元素大小可能会不同。要获取“真实”的大小矩形,请尝试使用element.RenderTransform.TransformBounds(new Rect(element.RenderSize))
。 - nmclean