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 值的形式提供。

示例

此示例演示如何 ArrangeArrangeOverride 实现中使用 。 基本思路是,应查询尝试调用Arrange的任何内容上的 DesiredSize,以便具有 的值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 UI 中初始布局定位的计算包括 一个 Measure 调用和一个 Arrange 调用(按该顺序排列)。 在 Measure 调用期间,布局系统使用 availableSize 度量来确定元素的大小要求。 在 Arrange 调用期间,布局系统将确定元素边界框的大小和位置。

首次生成布局时,它始终具有在 之前Arrange发生的 Measure 调用。 但是,在第一个 Arrange 布局通过后,调用可能会发生,而没有 Measure 之前。 当仅Arrange影响 的属性 (更改(例如对齐) )时,或者父级在没有 的情况下Measure收到 Arrange 时,可能会发生这种情况。

Measure 调用将自动使任何Arrange信息失效。 布局更新通常在布局系统) 确定的时间异步 (发生。 元素可能不会立即反映影响元素大小调整 (的属性更改,例如 Width) 。

布局更新可以由应用代码强制执行,而不是依赖于使用 UpdateLayout 方法的内置布局系统行为。 但是,不建议这样做。 这通常是不必要的,如果过度使用,可能会导致性能不佳。 在许多情况下,由于属性更改,从应用代码调用 UpdateLayout 可能是合适的,布局系统可能已经在处理更新。 布局系统还进行了优化,用于通过父子关系处理布局更改的级联,并且调用 UpdateLayout 可以针对此类优化。 不过,布局情况可能存在于更复杂的方案中,其中调用 UpdateLayout 是解决计时问题或其他布局问题的最佳选择。 只是故意和谨慎地使用它。

适用于

另请参阅