Определить ограничивающий прямоугольник элемента 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 ) );