UIElement 方法


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

更新:2007 年 11 月

更新 UIElementDesiredSize。父元素从其自身的 MeasureCore 实现调用此方法以形成递归布局更新。调用此方法构成布局更新的第一个处理过程(“测量”处理过程)。

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

语法

Visual Basic(声明)
Public Sub Measure ( _
    availableSize As Size _
)
Visual Basic (用法)
Dim instance As UIElement
Dim availableSize As Size

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

参数

availableSize
类型:System.Windows..::.Size

父元素可以为子元素分配的可用空间。子元素可以请求大于可用空间的空间,如果可在当前元素的内容模型中进行滚动,则提供的大小可以适应此空间。

备注

Windows Presentation Foundation (WPF) 中的布局位置计算由 Measure 调用和 Arrange 调用组成。在 Measure 调用期间,元素通过使用 availableSize 输入来确定其大小要求。在 Arrange 调用期间,完成元素的大小。

availableSize 可以是从零到无穷大之间的任意数字。参与布局的元素应返回它们对于给定 availableSize 所要求的最小 Size

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

布局更新异步发生,这样主线程就不会等待每一次可能的布局更改。通过对属性值进行代码隐藏检查来查询元素可能不会立即将更改反映到与大小或布局特征进行交互的属性(如 Width 属性)。

说明:

可以通过使用 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