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

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

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

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

Ответы [ 4 ]

18 голосов
/ 13 августа 2010

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

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

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

5 голосов
/ 11 января 2016

Опция 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));
    }
2 голосов
/ 13 августа 2010

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

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

myElement.GetBounds( relativeElement );

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

1 голос
/ 08 января 2018

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

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