更新:2007 年 11 月
命名空间:
System.Windows 程序集:
PresentationCore(在 PresentationCore.dll 中)
Public Sub Measure ( _
availableSize As Size _
)
Dim instance As UIElement
Dim availableSize As Size
instance.Measure(availableSize)
public void Measure(
Size availableSize
)
public:
void Measure(
Size availableSize
)
public void Measure(
Size availableSize
)
public function Measure(
availableSize : Size
)
Windows Presentation Foundation (WPF) 中的布局位置计算由 Measure 调用和 Arrange 调用组成。在 Measure 调用期间,元素通过使用 availableSize 输入来确定其大小要求。在 Arrange 调用期间,完成元素的大小。
availableSize 可以是从零到无穷大之间的任意数字。参与布局的元素应返回它们对于给定 availableSize 所要求的最小 Size。
初次实例化一个布局时,该布局总是在 Arrange 之前接受 Measure 调用。但是,在第一个布局处理过程之后,它可能收到不带 Measure 的 Arrange 调用;当仅影响 Arrange 的属性更改(如对齐方式)时,或者父元素收到不带 Measure 的 Arrange 时可能发生这种情况。Measure 调用将自动使 Arrange 调用无效。
布局更新异步发生,这样主线程就不会等待每一次可能的布局更改。通过对属性值进行代码隐藏检查来查询元素可能不会立即将更改反映到与大小或布局特征进行交互的属性(如 Width 属性)。
布局系统保持两个单独的无效布局队列,一个用于 Measure,另一个用于 Arrange。基于元素在元素执行布局的可视树上的顺序对布局队列进行排序;位于树上较高位置的元素处于队列的顶部,以避免父级中的重复更改导致冗余的布局。重复条目将自动从队列中移除,如果元素已经过布局验证,则元素也会自动从队列中移除。
更新布局时,首先清空 Measure 队列,然后清空 Arrange 队列。如果 Measure 队列中有元素,就绝不会排列 Arrange 队列中的元素。
本示例演示如何覆盖 Panel 元素的默认布局行为和创建派生自 Panel 的自定义布局元素。
本示例定义一个名为 PlotPanel 的简单的自定义 Panel 元素,该元素依照两个硬编码的 x 和 y 坐标定位子元素。在此示例中,x 和 y 均被设置为 50;因此,所有子元素均放置在 x 和 y 轴上的该位置处。
为了实现自定义的 Panel 行为,此示例使用了 MeasureOverride 和 ArrangeOverride 方法。每个方法均返回定位和呈现子元素所需的 Size 数据。
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
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
参考
其他资源