UIElement.Arrange(Rect) Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Позиционирует дочерние объекты и определяет размер пользовательского элемента UIElement. Родительские объекты, реализующие пользовательский макет для дочерних элементов, должны вызывать этот метод из реализации переопределения макета, чтобы сформировать рекурсивное обновление макета.
public:
virtual void Arrange(Rect finalRect) = Arrange;
void Arrange(Rect const& finalRect);
public void Arrange(Rect finalRect);
function arrange(finalRect)
Public Sub Arrange (finalRect As Rect)
Параметры
- finalRect
- Rect
Окончательный размер, который родитель вычисляет для дочернего элемента в макете, предоставленный в качестве значения Rect .
Примеры
В этом примере показано, как использовать Arrange в реализации ArrangeOverride . Основная идея заключается в том, что вы должны запрашивать DesiredSize на все, что вы пытаетесь вызвать Arrange , чтобы иметь значение finalRectдля , если реализация макета не имеет определенного дизайна, который изменяет или игнорирует требуемый размер перед передачей в качестве finalRect.
// Second arrange all children and return final size of panel
protected override Size ArrangeOverride(Size finalSize)
{
// Get the collection of children
UIElementCollection mychildren = Children;
// Get total number of children
int count = mychildren.Count;
// Arrange children
// We're only allowing 9 children in this panel. More children will get a 0x0 layout slot.
int i;
for (i = 0; i < 9; i++)
{
// Get (left, top) origin point for the element in the 3x3 block
Point cellOrigin = GetOrigin(i, 3, new Size(100, 100));
// Arrange child
// Get desired height and width. This will not be larger than 100x100 as set in MeasureOverride.
double dw = mychildren[i].DesiredSize.Width;
double dh = mychildren[i].DesiredSize.Height;
mychildren[i].Arrange(new Rect(cellOrigin.X, cellOrigin.Y, dw, dh));
}
// Give the remaining children a 0x0 layout slot
for (i = 9; i < count; i++)
{
mychildren[i].Arrange(new Rect(0, 0, 0, 0));
}
// Return final size of the panel
return new Size(300, 300);
}
Комментарии
Вызов Arrange потенциально достигает реализации ArrangeOverride этого конкретного класса. В противном случае большинство классов FrameworkElement имеют неявное поведение макета по умолчанию для Arrange.
Вычисление начального расположения макета в пользовательском интерфейсе XAML состоит из вызова measure и Arrange вызова в этом порядке.
Measure Во время вызова система макета определяет требования к размеру элемента с помощью availableSize измерения. Во время вызова Упорядочивания система макета завершает размер и положение ограничивающего прямоугольника элемента.
При первом создании макета он всегда имеет вызов Measure , который происходит раньше Arrange. Однако после первого прохождения макета Arrange вызов может произойти без предыдущего Measure . Это может произойти, если свойство, которое влияет только Arrange на изменение (например, выравнивание), или когда родитель получает объект Arrange без Measure.
Вызов Measure автоматически отменит любые Arrange сведения. Обновления макета обычно выполняются асинхронно (во время, определяемого системой макета). Элемент может не сразу отражать изменения свойств, влияющих на размер элемента (например , Width).
Обновления макета могут быть вынуждены кодом приложения, а не полагаться на встроенное поведение системы макета с помощью метода UpdateLayout . Однако это не рекомендуется. Обычно это ненужно и может привести к плохой производительности при чрезмерном выполнении. Во многих ситуациях, когда вызов UpdateLayout из кода приложения может быть подходящим из-за изменений свойств, система макета, вероятно, уже будет обрабатывать обновления. Система макета также имеет оптимизацию для работы с каскадами изменений макета с помощью отношений родительского-дочернего элемента, и вызов UpdateLayout может работать с такими оптимизациями. Тем не менее, возможно, что ситуации макета существуют в более сложных сценариях, где вызов UpdateLayout является лучшим вариантом для устранения проблемы с временем или другой проблемы с макетом. Просто используйте его намеренно и экономно.