UIElement 方法


.NET Framework 类库
UIElement..::.Arrange 方法

更新:2007 年 11 月

定位子元素并确定 UIElement 的大小。父元素从其 ArrangeCore 实现(或 WPF 框架级别等效项)调用此方法以形成递归布局更新。此方法产生第二次布局更新。

命名空间:  System.Windows
程序集:  PresentationCore(在 PresentationCore.dll 中)

语法

Visual Basic(声明)
Public Sub Arrange ( _
    finalRect As Rect _
)
Visual Basic (用法)
Dim instance As UIElement
Dim finalRect As Rect

instance.Arrange(finalRect)
C#
public void Arrange(
    Rect finalRect
)
Visual C++
public:
void Arrange(
    Rect finalRect
)
J#
public void Arrange(
    Rect finalRect
)
JScript
public function Arrange(
    finalRect : Rect
)
XAML
不能在 XAML 中使用方法。

参数

finalRect
类型:System.Windows..::.Rect

父元素为子元素计算的最终大小,作为 Rect 实例提供。

备注

对于 WPF 框架级元素派生方案,不应(而且不能,除非使用阴影)更改 Arrange 的行为。相反,您应该在类中重写 ArrangeOverride 实现。您的 ArrangeOverride 实现由 Arrange 在内部调用,并作为默认 WPF 框架级布局操作的组成部分。如果您的 ArrangeCore 实现有子元素,它还应该调用每个子元素上的 ArrangeOverride

对于 WPF 核心级别元素派生方案,不应(而且不能,除非使用阴影)更改 Arrange 的行为。相反,您应该在类中重写 ArrangeCore。您的 ArrangeCore 实现由 Arrange 在内部调用,并作为默认 WPF 框架级别布局操作的组成部分。不过,这是假定您正在使用 WPF 框架级别布局及其布局系统,如果您正专门从 UIElement 基元素类在 WPF 核心级别派生元素,则情况往往不是这样。如果您的 ArrangeCore 实现有子元素,它还应该调用每个子元素上的 Arrange。请注意,WPF 核心级别方案意味着您并未使用 FrameworkElement 派生类,因为 FrameworkElement 会密封 ArrangeCore

WPF 框架级别布局在 Windows Presentation Foundation (WPF) 中的定位计算由 Measure 调用和 Arrange 调用组成。在 Measure 调用期间,元素使用提供的 Size (availableSize) 参数来确定其大小要求。在 Arrange 调用期间,完成并返回元素大小。

availableSize 可以是从零到无穷大之间的任意数字。要进行布局的元素通过 availableSize 参数返回它们所需的最小 Size

初次实例化一个布局时,该布局总是在 Arrange 之前接受 Measure 调用。但是,在第一个布局处理过程之后,它可能收到不带 MeasureArrange 调用;当仅影响 Arrange 的属性更改(如对齐方式)时,或者父元素收到不带 MeasureArrange 时可能发生这种情况。Measure 调用将自动使 Arrange 调用无效。

布局更新通常异步发生(发生时间由布局系统确定)。元素可能不会立即将更改反映到影响元素大小的属性(如 Width)。

说明:

可以通过使用 UpdateLayout 方法来强制进行布局更新;但是,不建议调用此函数,因为这通常没有必要且可能导致性能降低。在很多可能适合调用 UpdateLayout 的情况中,布局系统可能正在处理更新。布局系统可以以某种将所有必要更新优化为包的组成部分的方式来处理布局更改。

布局系统保持两个单独的无效布局队列,一个用于 Measure,另一个用于 Arrange。根据可视化树中的元素的顺序来对布局队列排序。位于树上较高处的元素在队列的顶部,以避免父级中的重复更改导致冗余的布局。重复项自动从队列中删除,如果元素已经无效,也会自动从队列中删除。

更新布局时,首先清空 Measure 队列,然后清空 Arrange 队列。如果 Measure 队列中有元素,就绝不会排列 Arrange 队列中的元素。

示例

本示例演示如何覆盖 Panel 元素的默认布局行为和创建派生自 Panel 的自定义布局元素。

本示例定义一个名为 PlotPanel 的简单的自定义 Panel 元素,该元素依照两个硬编码的 x 和 y 坐标定位子元素。在此示例中,xy 均被设置为 50;因此,所有子元素均放置在 x 和 y 轴上的该位置处。

为了实现自定义的 Panel 行为,此示例使用了 MeasureOverrideArrangeOverride 方法。每个方法均返回定位和呈现子元素所需的 Size 数据。

Visual Basic
Public Class PlotPanel
    Inherits Panel
    'Override the default Measure method of Panel.

    Protected Overrides Function MeasureOverride(ByVal availableSize As System.Windows.Size) As System.Windows.Size
        Dim childSize As Size = CType(availableSize, Size)
        For Each child As UIElement In InternalChildren
            child.Measure(childSize)
        Next
        Return MyBase.MeasureOverride(availableSize)
    End Function
    Protected Overrides Function ArrangeOverride(ByVal finalSize As System.Windows.Size) As System.Windows.Size
        For Each child As UIElement In InternalChildren
            Dim x As Double = 50
            Dim y As Double = 50
            child.Arrange(New Rect(New System.Windows.Point(x, y), child.DesiredSize))
        Next
        Return MyBase.ArrangeOverride(finalSize)
    End Function
End Class
C#
public class PlotPanel : Panel
{
    // Default public constructor
    public PlotPanel()
        : base()
    {
    }

    // Override the default Measure method of Panel
    protected override Size MeasureOverride(Size availableSize)
    {
        Size panelDesiredSize = new Size();

        // In our example, we just have one child. 
        // Report that our panel requires just the size of its only child.
        foreach (UIElement child in InternalChildren)
        {
            child.Measure(availableSize);
            panelDesiredSize = child.DesiredSize;
        }

        return panelDesiredSize ;
    }
    protected override Size ArrangeOverride(Size finalSize)
    {
        foreach (UIElement child in InternalChildren)
        {
            double x = 50;
            double y = 50;

            child.Arrange(new Rect(new Point(x, y), child.DesiredSize));
        }
        return finalSize; // Returns the final Arranged size
    }
}

有关完整示例,请参见 创建简单自定义面板的示例

平台

Windows Vista

.NET Framework 和 .NET Compact Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见.NET Framework 系统要求

版本信息

.NET Framework

受以下版本支持:3.5、3.0
另请参见

参考

标记 :


Page view tracker