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 является лучшим вариантом для устранения проблемы с временем или другой проблемы с макетом. Просто используйте его намеренно и экономно.

Применяется к

См. также раздел