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 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;} }