wpf布局递归的调用到底是怎样的顺序?我一直挺模糊。
按照继承顺序。
已知:
1.1.UIElement:声明了Measure
1.2.UIElement:声明了MeasureCore,返回Size(0,0)
1.3.UIElement:Measure调用了this.MeasureCore
2.1.FrameworkElement:声明了MeasureOverride返回Size(0,0)
2.2.FrameworkElement:重载MeasureCore中调用了this.MeasureOverride
2.3.FrameworkElement:MeasureCore是封闭的
3.1.Control:重载MeasureOverride中调用了child.Measure
3.2.Panel:未重载MeasureOverride
4.1.Window:重载MeasureOverride调用了child.Measure
4.2.UserControl:未重载MeasureOverride
4.3.Grid:重载MeasureOverride中对于每个孩子调用了child.Measure
能够整理出来的
this.Measure=>MeasureCore=>MeasureOverride=>child.Measure的调用形成了一个递归,这个顺序是确定的。
而且一般来说,this.Measure=>MeasureCore=>MeasureOverride的调用是固定下来了的。MeasureOverride=>child.Measure的调用则看我们自定义控件的继承了。
如果是继承Control,那么可以调用base.MeasureOverride()或者显式调用child.Measure就能继续这个递归;如果是继承FrameworkElement或Panel,则只能我们自己显式调用child.Measure了。
问题是在一个窗体中,触发这个递归的第一次this.Measure调用在在哪里进行的?
怎么看待Measure和Arrange两个阶段
Measure阶段的原则是子元素会根据其内容的需求返回尺寸
Arrange阶段的原则是子元素按照父控件给的尺寸设定自己的尺寸
所以重要的是我们先确定需要实现哪种布局,然后第一点是就要在Arrange阶段给子控件一个布局规则对应的值。而如何计算给子控件的值,可以放在可以Measure结束后Arrange开始前的任何地方。第二点是我们要返回多大的值,是决定于子控件,还是自己。
最后一个阶段,Render
OnRender定义于UIElement中,在Arrange函数中被调用,调用DrawContext绘制控件。FrameworkElement没有重载它,Control没有重载它。我们只在有必要的自定义绘制时重载。
标签:控件,child,调用,递归,布局,MeasureOverride,Measure,重载,wpf From: https://www.cnblogs.com/ggtc/p/18151568