2010-09-08 3 views
0

Есть ли простой способ найти прямоугольник (область и местоположение), который потребуется для покрытия набора элементов управления? VisualTreeHelper.GetDescandentBounds() отлично работает, но нет перегруженных методов, где я могу указать элементы управления, которые он должен учитывать для поиска прямоугольника границ. Будем очень благодарны за любое простое решение.Границы прямоугольника выбранных элементов управления в wpf

Благодаря

ответ

2

Rect имеет Union(Rect) метод, который увеличивает текущий прямоугольник, чтобы также включать в себя второй прямоугольник. С помощью LINQ (не забудьте добавить using System.Linq; в файл кода), это также довольно просто получить список прямоугольников для списка визуалов:

private Rect GetBoundingRect(Visual relativeTo, List<Visual> visuals) 
{ 
    Vector relativeOffset = new Point() - relativeTo.PointToScreen(new Point()); 

    List<Rect> rects = visuals 
     .Select(v => new Rect(v.PointToScreen(new Point()) + relativeOffset, VisualTreeHelper.GetDescendantBounds(v).Size)) 
     .ToList(); 

    Rect result = rects[0]; 
    for (int i = 1; i < rects.Count; i++) 
     result.Union(rects[i]); 
    return result; 
}  

Edited код: Теперь он будет занимать позицию отдельных визуальными в счет относительно данного визуального.

+0

Это не дает унифицированный прямоугольник, потому что Визуальные объекты могут появляться в углах разницы родительской панели, а расчет в этом фрагменте основан на привязке потомка визуального изображения, а не относительно родительской панели. – sudarsanyes

+0

Итак, если у меня есть 5 кнопок (с одинаковым размером), расположенных в разных углах панели, метод всегда возвращает прямоугольник, который напоминает размер одной кнопки. на самом деле мне нужно, чтобы он возвращал прямоугольник, который может вместить все пять кнопок. любая идея о том, как этого достичь? – sudarsanyes

+1

Ах, не понял, что метод работал так, обновляя мой ответ. – Bubblewrap