获取WPF元素的真实可视边界框?

6
为了简化我的问题,我想计算一个布局转换(甚至可能是渲染转换)形状的边界框,以便我可以始终完美地围绕该形状放置一个矩形,无论其旋转或缩放如何。如果您能解决这个问题,我会很高兴。
更复杂的问题是计算任何框架元素的视觉边界框。通过“视觉边界框”,我指的是框架元素中最上面可见的像素确定顶部边界,最右边可见的像素确定右边界等。如果您能解决这个问题,我会更加高兴。
我尝试使用LayoutInformation.GetLayoutSlot()进行操作,但它并没有按预期方式工作。“布局插槽”实际上比实际边界要大得多。我还尝试使用VisualTreeHelper.GetDescendantBounds(),但由于我的测试形状的VisualParent受到保护,我无法访问此属性,并决定在进一步深入之前在此处检查。
我希望有人能提供一种轻松的方法来获取WPF元素的真实视觉边界框,在所有转换之后计算。如果我的问题没有表述清楚,请告诉我。
3个回答

9
private Rect GetRectOfObject(FrameworkElement _element)
{
    Rect rectangleBounds = _element.RenderTransform.TransformBounds(
        new Rect(_element.RenderSize);

    return rectangleBounds;
}

也许这会对您有所帮助。

8
new Rect(0, 0, _element.Width, _element.Height) 可以简化为 new Rect(_element.RenderSize) - nmclean
对我来说,只有使用 element.ActualWidthelement.ActualHeight 才有效。 - oo_dev

4
你可以使用 VisualTreeHelper.GetDescendantBounds() 获得良好的结果,可以使用 VisualTreeHelper.GetParent() 获取受保护的 VisualParent 属性。但是,你可能想要的是在形状本身上调用 GetDescendantBounds,而不是它的父级,因为尽管其名称如此,该方法返回的是父级及其所有后代的边界。

1
当我在我的形状上执行 GetDescendantBounds() 时,它返回一个矩形,即使形状上有任何变换,也是原始未变换形状的边界。如果我使用 GetParent() 获取形状的父级,然后将该父级转换为 Visual,并将该 Visual 传递到 GetDescendantBounds() 中,它返回一个比我的形状大得多的矩形。 - Dalal

0

这个问题并不容易,因为控件可能会在其边界之外绘制。

但是如果您假设这种情况不会发生,您可以通过使用parent.TranslatePoint(point_in_child_coord_system, child)(0,0)(child.ActualWidth,0)(child.ActualWidth, child.ActualHeight)(0,child.ActualHeight)转换到父坐标系来解决问题。然后对所有点的x和y坐标进行排序,并使用最小值和最大值找到边界框。

注意:由于可能存在子旋转,所以需要排序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接