Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting the true visual bounding box of a WPF element?

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 a rectangle perfectly around the shape, no matter what its rotation or scale may be. If you can solve this, I will be happy.

The more complex problem is that of calculating the visual bounding box of any framework element. By 'visual bounding box' I mean the top-most visible pixel within the framework element determines the top-bound, the right-most visible pixel determines the right-bound, etc. If you can solve this, I will be even more happy.

I have tried playing with LayoutInformation.GetLayoutSlot(), but this did not work in the expected manner. The 'layout slot' was actually MUCH larger than the actual bounds. I also tried using VisualTreeHelper.GetDescendantBounds(), but because of the VisualParent of my test shape being protected I could not manage to access this property, and decided to check here before I go any further into it.

I hope that somebody can provide an easy way of getting the true visual bounding box of an element in WPF, that is calculated AFTER all transforms. If I have not made something clear in my question, please let me know.

like image 380
Dalal Avatar asked Feb 22 '11 22:02

Dalal


2 Answers

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

    return rectangleBounds;
}

Maybe this will help out.

like image 182
Intara Tanlamai Avatar answered Sep 22 '22 21:09

Intara Tanlamai


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.

like image 32
Rick Sladkey Avatar answered Sep 23 '22 21:09

Rick Sladkey