FrameworkElement.MeasureOverride(Size) 方法

定义

为布局周期的“度量”传递提供行为。 类可以重写此方法以定义其自己的“Measure”传递行为。

protected:
 virtual Size MeasureOverride(Size availableSize) = MeasureOverride;
Size MeasureOverride(Size const& availableSize);
protected virtual Size MeasureOverride(Size availableSize);
function measureOverride(availableSize)
Protected Overridable Function MeasureOverride (availableSize As Size) As Size

参数

availableSize
Size

此对象可以提供给子对象的可用大小。 无穷大可以指定为一个值,以指示对象将调整为任何可用内容的大小。

返回

此对象在布局期间确定它所需的大小,具体取决于其为子对象分配的大小计算,或者基于其他注意事项(如固定容器大小)。

示例

此示例实现 MeasureOverride 以自定义自定义面板实现的“Measure”传递逻辑。 请特别注意代码的以下方面:

  • 循环访问子级。
  • 对于每个子级,调用 Measure,使用基于面板逻辑如何处理子级数量及其自己的已知大小限制有意义的 Size
  • 在本例中,返回其大小 (,此简单面板返回固定大小,而不是在) 累计度量值时计算的大小。
// First measure all children and return available size of panel
protected override Size MeasureOverride(Size availableSize)
{

    // Measure first 9 children giving them space up to 100x100, remaining children get 0x0 
    int i = 0;
    foreach (FrameworkElement child in Children)
    {
        if (i < 9)
        {
            child.Measure(new Size(100, 100));
        }
        else
        {
            child.Measure(new Size(0, 0));
        }

        i++;
    }


    // return the size available to the whole panel, which is 300x300
    return new Size(300, 300);
}
'First measure all children and return available size of panel 
Protected Overrides Function MeasureOverride(ByVal availableSize As Size) As Size
    'Measure first 9 children giving them space up to 100x100, remaining children get 0x0 
    Dim i As Integer = 0
    For Each child As FrameworkElement In Children
        If i < 9 Then
            child.Measure(New Size(100, 100))
        Else
            child.Measure(New Size(0, 0))
        End If
        i += 1
    Next
    'return the size available to the whole panel, which is 300x300 
    Return New Size(300, 300)
End Function

注解

此方法具有默认实现,该实现为大多数 FrameworkElement 派生类执行内置布局。 MeasureOverride 为 Measure 提供行为,只要通过内部布局逻辑或你自己的应用代码调用 Measure (包括你自己的任何 MeasureOverride 方法用于其他类)。 如果要生成模板化控件,MeasureOverride 逻辑定义控件的特定“Measure”传递布局逻辑。

应用运行时元素如何通过布局过程的常规设计分为两个步骤:“度量”传递,然后是“排列”传递。 想要自定义布局处理的“Measure”传递的控制作者 (或面板作者) 应替代 MeasureOverride。 实现应执行以下操作:

  • 循环访问属于布局的一部分的类的特定子对象集合,并为每个子对象调用 Measure
  • 在调用 Measure) 后,立即获取每个子级上的 DesiredSize (此属性设置为属性。
  • 根据子对象所需大小的运行度量值,计算父级所需的净大小。 MeasureOverride 的返回值应为对象自己的所需大小,然后成为当前对象的父对象的 Measure 输入。 此过程在布局系统中继续进行,直到到达页面/对象树的根目录。 在此过程中,子对象可能会返回比初始 availableSize 更大的 DesiredSize 大小,以指示子对象需要更多空间。 这可以通过引入可滚动区域、调整父控件的大小、建立某种堆积顺序的方式,或者在测量或排列内容(根据布局容器的预期功能而有所不同)的任意数量的解决方案中进行处理。

适用于

另请参阅