Получаете истинную визуальную ограничивающую рамку элемента WPF? - PullRequest
5 голосов
/ 23 февраля 2011

Для упрощенной версии моей задачи я хотел бы рассчитать ограничивающую рамку для фигуры с преобразованием макета (возможно, даже с преобразованием рендера), чтобы всегда можно было идеально разместить прямоугольник вокруг фигуры, независимо от ее вращение или масштаб может быть. Если вы можете решить это, я буду счастлив.

Более сложной проблемой является вычисление визуальной ограничительной рамки любого элемента каркаса. Под «визуальным ограничивающим прямоугольником» я подразумеваю, что самый верхний видимый пиксель в элементе каркаса определяет верхнюю границу, самый правый видимый пиксель определяет правую границу и т. Д. Если вы сможете решить эту проблему, я буду еще более счастлив .

Я пытался поиграть с LayoutInformation.GetLayoutSlot (), но это не сработало ожидаемым образом. «Слот макета» был НАМНОГО больше, чем фактические границы. Я также пытался использовать VisualTreeHelper.GetDescendantBounds (), но из-за того, что VisualParent моей тестовой фигуры защищен, мне не удалось получить доступ к этому свойству, и решил проверить здесь, прежде чем углубляться в него.

Я надеюсь, что кто-то может предоставить простой способ получить истинную визуальную ограничивающую рамку элемента в WPF, который рассчитывается ПОСЛЕ всех преобразований. Если я не прояснил что-то в своем вопросе, пожалуйста, дайте мне знать.

Ответы [ 3 ]

9 голосов
/ 18 июня 2012
private Rect GetRectOfObject(FrameworkElement _element)
{
    Rect rectangleBounds = new Rect();
    rectangleBounds = _element.RenderTransform.TransformBounds(new Rect(0, 0, _element.Width, _element.Height));
    return rectangleBounds;
}

Может быть, это поможет.

4 голосов
/ 23 февраля 2011

Вы получите хорошие результаты с VisualTreeHelper.GetDescendantBounds(), и вы можете использовать VisualTreeHelper.GetParent(), чтобы получить доступ к защищенному в противном случае свойству VisualParent.Однако то, что вы, вероятно, захотите сделать, это вызвать GetDescendantBounds для самой фигуры, а не для ее родителя, потому что, несмотря на его имя, метод возвращает границы родителя и всех его потомков.

0 голосов
/ 31 декабря 2012

Проблема не из легких, так как элемент управления может рисовать за пределами своих границ. Но если вы предполагаете, что этого не происходит, вы можете решить эту проблему, используя parent.TranslatePoint (point_in_child_coord_system, child) для преобразования (0,0) (child.ActualWidth, 0) (child.ActualWidth, child.ActualHeight) и (0 , child.ActualHeight) в родительскую систему координат. Затем отсортируйте координаты x и y всех точек и используйте минимальное и максимальное значения, чтобы найти ограничивающий прямоугольник. Примечание: сортировка необходима из-за возможного дочернего вращения.

...