补充:
经@super110的提示,这里可能忽略了一点东西,而我又仔细分析了一下,可能一般人很容易在这里理解起来比较纳闷。注意,以下描述基于实验,而非基于原理:
我们再仔细分析这两个方法:
{
foreach (var item in this.Children)
{
item.Measure(availableSize);
}
return “此返回值将作为该容器的DesiredSize”;
}
protected override Size ArrangeOverride(Size finalSize)
{
foreach (var item in this.Children)
{
FrameworkElement my = item as FrameworkElement;
my.Arrange(new Rect(0, 0, my.Width, my.Height));
}
return “此返回值将作为此容器的ActualWidth和ActualHeight”;
}
在Measure每个元素的时候,这个方法执行完就会产生DesiredSize值,其实它也就是MeasureOverride()方法的返回值。因为这其实是一个递归系统。
DesiredSize的取值方法:
1,对于非容器类的控件如Image,布局系统会取其所设置的Width和Height与availablesize相比较的最小值,打个比如,这个有点像进入公司的时候老板问你期望的待遇,当然他心中有一个数字,如果你的数字大于他的数字,以他的为准;如果你的数字小于他的数字,以你的为准,我暂且称其为“老板不吃亏原则”
2,对于容器控件,由于是我们写代码控制MeasureOverride方法的返回值,所以这个返回值就是该容器的DesiredSize值。换句话说,如果这个容器处于另外一个容器当中,当父容器调用子容器的Measure方法之后,这个子容器返回的值就是它的DesiredSize值。
ActualWidth和ActualHeight的计算:
1,对于非容器控件,往往是由容器给定的值决定,即容器在调用的Arrange方法的时候,给根据自身规则情况来分配值,这个值就是非容器控件的ActualWidth和ActualHeight
2,对于容器控件,其值由ArrangeOverride方法的返回值来确定,原理同DesiredSize一样
DesiredSize,ActualWidth和ActualHeight这几个值都是不能在程序中设置的,我们看到它要么由布局系统计算,要么由容器来计算,我们在程序中一般只读取这几个值。
源代码下载:http://files.cnblogs.com/hielvis/PhotoWall.rar