MeasureOverride 和 ArrangeOverride
阿新 • • 發佈:2018-05-26
edit bound IT custom pro constrain control 定義 weight 原文:MeasureOverride 和 ArrangeOverrideFrameworkElement.MeasureOverride方法實現當在派生類中重寫時,測量子元素在布局中所需的大小,然後確定?FrameworkElement?派生類的大小。
?ArrangeOverride (
/// <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;
}
}
FrameworkElement.MeasureOverride方法實現當在派生類中重寫時,測量子元素在布局中所需的大小,然後確定?FrameworkElement?派生類的大小。
FrameworkElement.MeasureOverride Method
函數原型:
protected virtual?Size?MeasureOverride (Size?availableSize)
假設A為父element,B為子elements集合中的一個元素。通過在FrameworkElement的子類中override這個方法來計算B所需要的空間。
參數:A提供的可用空間。
返回值:通過計算後確定的A所需的空間。
在override的MeasureOverride方法中要做以下3步:
- 對每一個B調用Measure方法。
- Measure方法調用完後,B的期望大小就保存在DesiredSize中了。
- 計算所有的DesiredSize的和,作為總的期望空間返回。
FrameworkElement.ArrangeOverride 方法實現在派生類中重寫時,為?FrameworkElement?派生類定位子元素並確定大小。
FrameworkElement.ArrangeOverride Method
函數原型:
protected virtual?Size
???????????????Size?finalSize
)
參數:?A所占的空間
返回值:A實際所用到的空間
通過在子類中override這個方法,實現為A中的所有子元素定位的目的。
例如: public class CustomControl1 : Panel {/// <summary>
/// 先測量需要多大尺寸,做個申報準備
/// </summary>
/// <param name="constraint">限定的尺寸,比如,規定了width和height</param>
/// <returns></returns>
//定義預期的寬度和高度
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