2011-02-22 42 views
5

对于我的问题的简化版本,我想计算布局转换(甚至可能是渲染转换)形状的边界框,以便我可以始终围绕形状完美地适合矩形,无论其旋转方式如何或规模可能。如果你能解决这个问题,我会很高兴。获取WPF元素的真实可视边界框?

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

我试着玩LayoutInformation.GetLayoutSlot(),但这并没有以预期的方式工作。 '布局槽'实际上比实际的边界大得多。我也尝试使用VisualTreeHelper.GetDescendantBounds(),但由于我的测试形状的VisualParent受到保护,因此无法访问此属性,并决定在继续深究之前先检查它。

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

回答

4

您将通过VisualTreeHelper.GetDescendantBounds()获得良好结果,您可以使用VisualTreeHelper.GetParent()访问受其他保护的VisualParent属性。然而,你可能想要做的就是在形状本身上调用GetDescendantBounds,而不是它的父类,因为尽管它的名字是,该方法返回了父类及其所有后代的范围。

+0

当我在我的形状上执行'GetDescendantBounds()'时,它会返回一个矩形,它是原始非变形形状的边界,尽管形状上有任何变形。如果我使用'GetParent()'获得了形状的父对象,然后将该父对象转换为一个Visual对象,并将该Visual对象传递给'GetDescendantBounds()',它将返回一个比我的形状大得多的矩形。 – Dalal 2011-02-23 18:04:39

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

也许这会有所帮助。

+8

'new Rect(0,0,_element.Width,_element.Height)'可以简化为'new Rect(_element.RenderSize)'。 – nmclean 2013-08-16 13:23:52

0

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