For a simplified version of my problem, I would like to calculate the bounding box of a layout-transformed (possibly even render-transformed) shape, so that I can always fit
private Rect GetRectOfObject(FrameworkElement _element)
{
Rect rectangleBounds = new Rect();
rectangleBounds = _element.RenderTransform.TransformBounds(new Rect(0, 0, _element.Width, _element.Height));
return rectangleBounds;
}
Maybe this will help out.
The problem is not easy, as a control may draw outside its bounds.
But if you assume this doesn't happen you can solve the problem by using parent.TranslatePoint(point_in_child_coord_system, child)
to transform (0,0)
, (child.ActualWidth,0)
, (child.ActualWidth, child.ActualHeight)
and (0,child.ActualHeight)
to the parent coord system. Then sort the x and y coordinates of all points and use minimum and maximum values to find the bounding box.
Note: sorting is necessary because of possible child rotation.
You will get good results with VisualTreeHelper.GetDescendantBounds()
and you can use VisualTreeHelper.GetParent()
to gain access to the otherwise protected VisualParent
property. However what you probably want to do is call GetDescendantBounds
on the shape itself, not its parent, because in spite of its name, the method returns the bounds of the parent and all of its decendants.