Определить ограничивающий прямоугольник элемента WPF относительно некоторого родителя

Я считаю это довольно простым запросом, но я не могу найти окончательного ответа в моих поисках. Как определить границы конкретного визуального элемента в моем окне относительно другого родительского элемента?

Я пробовал использовать LayoutInformation.GetLayoutSlot, но это просто возвращает Rect в 0,0 и не отражает фактическое местоположение элемента.

Я пытаюсь сделать "скриншот" окна с помощью RenderTargetBitmap, а затем обрезать его конкретному элементу, но я не могу получить границы элемента, чтобы узнать, как обрезать растровое изображение!

Ответы

Ответ 1

Это довольно просто:

public static Rect BoundsRelativeTo(this FrameworkElement element,
                                         Visual relativeTo)
{
  return
    element.TransformToVisual(relativeTo)
           .TransformBounds(LayoutInformation.GetLayoutSlot(element));
}

На самом деле это может быть излишним, чтобы поместить его в отдельный метод.

Ответ 2

Nevermind, мне наконец удалось разобраться с ним, используя комбинацию LayoutInformation.GetLayoutSlot() (хотя я, вероятно, мог бы использовать либо ActualWidth/ActualHeight, либо RenderSize) и UIElement.TranslatePoint().

Это довольно сложное решение, когда это может быть так просто:

myElement.GetBounds( relativeElement );

Хорошо. Может быть, время для метода расширения.:)

Ответ 3

Параметр LayoutSlot вообще не работал у меня. Это закончило тем, что предоставило мне дочернюю позицию относительно указанного элемента управления родителем/предком:

    public static Rect BoundsRelativeTo(this FrameworkElement child, Visual parent)
    {
        GeneralTransform gt = child.TransformToAncestor(parent);
        return gt.TransformBounds(new Rect(0, 0, child.ActualWidth, child.ActualHeight));
    }

Ответ 4

Учитывая несколько предложений, которые я нашел здесь, это решило проблему для меня.

item.TransformToVisual( relativeToElement )
    .TransformBounds( new Rect( item.RenderSize ) );