1. 程式人生 > >MeasureOverride 和 ArrangeOverride

MeasureOverride 和 ArrangeOverride

edit bound IT custom pro constrain control 定義 weight

原文: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);
}

/// <summary>
/// 排列每個元素
/// </summary>
/// <param name="arrangeBounds">測量的尺寸</param>
/// <returns></returns>
protected override Size ArrangeOverride(Size arrangeBounds){
double currentX = 100;
UIElement element;
for (int i = 0; i < Children.Count; i++){
element = Children[i];
//排列每個元素
Children[i].Arrange(new Rect(currentX, 0, element.DesiredSize.Width, element.DesiredSize.Height));
currentX += element.DesiredSize.Width;
}
return arrangeBounds;
}
}


MeasureOverride 和 ArrangeOverride