天天看点

MeasureOverride 和 ArrangeOverrideFrameworkElement.MeasureOverride方法实现当在派生类中重写时,测量子元素在布局中所需的大小,然后确定 FrameworkElement 派生类的大小。FrameworkElement.ArrangeOverride 方法实现在派生类中重写时,为 FrameworkElement 派生类定位子元素并确定大小。

原文: MeasureOverride 和 ArrangeOverride

FrameworkElement.MeasureOverride方法实现当在派生类中重写时,测量子元素在布局中所需的大小,然后确定 FrameworkElement 派生类的大小。

FrameworkElement.MeasureOverride Method

函数原型:

protected virtual Size MeasureOverride (Size availableSize)

假设A为父element,B为子elements集合中的一个元素。通过在FrameworkElement的子类中override这个方法来计算B所需要的空间。

参数:A提供的可用空间。

返回值:通过计算后确定的A所需的空间。

在override的MeasureOverride方法中要做以下3步:

  1. 对每一个B调用Measure方法。
  2. Measure方法调用完后,B的期望大小就保存在DesiredSize中了。
  3. 计算所有的DesiredSize的和,作为总的期望空间返回。

FrameworkElement.ArrangeOverride 方法实现在派生类中重写时,为 FrameworkElement 派生类定位子元素并确定大小。

FrameworkElement.ArrangeOverride Method

protected virtual Size ArrangeOverride (

               Size finalSize

)

参数: A所占的空间

返回值:A实际所用到的空间

通过在子类中override这个方法,实现为A中的所有子元素定位的目的。

例如:

public class CustomControl1 : Panel {

/// <summary>

/// 先测量需要多大尺寸,做个申报准备

/// </summary>

/// <param name="constraint">限定的尺寸,比如,规定了width和height</param>

/// <returns></returns>

protected override Size MeasureOverride(Size constraint){

//定义预期的宽度和高度

double height = 0, width = 0;

UIElement element;

//遍历每个元素,计算所需的总尺寸

for (int i = 0; i < Children.Count; i++){

element = Children[i];

//按照限定的尺寸测量一下自己,拿镜子找着自己

element.Measure(constraint);

if (height < element.DesiredSize.Height)

height = element.DesiredSize.Height;

width += element.DesiredSize.Width;

}

//申报,需要这个尺寸

return new Size(width, height);

/// 排列每个元素

/// <param name="arrangeBounds">测量的尺寸</param>

protected override Size ArrangeOverride(Size arrangeBounds){

double currentX = 100;

//排列每个元素

Children[i].Arrange(new Rect(currentX, 0, element.DesiredSize.Width, element.DesiredSize.Height));

currentX += element.DesiredSize.Width;

return arrangeBounds;

继续阅读