获得WPF元素的真正可视边界框?

时间:2011-02-22 22:14:00

标签: wpf wpf-controls

对于我的问题的简化版本,我想计算一个布局转换(甚至可能是渲染转换)形状的边界框,这样我总能在形状周围完美地放置一个矩形,无论它是什么旋转或缩放可能是。如果你能解决这个问题,我会很高兴。

更复杂的问题是计算任何框架元素的可视边界框。通过'视觉边界框',我的意思是框架元素中最顶部的可见像素决定了上限,最右边的可见像素决定了右边界等等。如果你能解决这个问题,我会更加开心

我尝试过使用LayoutInformation.GetLayoutSlot(),但这并不是以预期的方式工作。 '布局槽'实际上比实际边界大很多。我也尝试使用VisualTreeHelper.GetDescendantBounds(),但由于我的测试形状的VisualParent受到保护,我无法访问此属性,并决定在我进一步进入之前进行检查。

我希望有人可以提供一种简单的方法来获取WPF中元素的真实可视边界框,这是在所有变换之后计算的。如果我在问题中没有说清楚,请告诉我。

3 个答案:

答案 0 :(得分:9)

private Rect GetRectOfObject(FrameworkElement _element)
{
    Rect rectangleBounds = new Rect();
    rectangleBounds = _element.RenderTransform.TransformBounds(new Rect(0, 0, _element.Width, _element.Height));
    return rectangleBounds;
}

也许这会有所帮助。

答案 1 :(得分:4)

VisualTreeHelper.GetDescendantBounds()您将获得良好的结果,并且您可以使用VisualTreeHelper.GetParent()来访问受保护的VisualParent媒体资源。但是你可能想做的是在形状本身上调用GetDescendantBounds,而不是它的父节点,因为尽管它的名称,该方法返回父节点及其所有后代的边界。

答案 2 :(得分:0)

问题并不容易,因为控制可能超出其界限。但是如果你认为这没有发生,你可以通过使用parent.TranslatePoint(point_in_child_coord_system,child)来转换(0,0)(child.ActualWidth,0)(child.ActualWidth,child.ActualHeight)和(0,child.ActualHeight)到父coord系统。然后对所有点的x和y坐标进行排序,并使用最小值和最大值来查找边界框。注意:由于可能的子轮换而需要排序。