2011-02-22 91 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座標進行排序,並使用最小值和最大值來查找邊界框。注意:由於可能的兒童輪換,排序是必要的。