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没有重载它。我们只在有必要的自定义绘制时重载。

怎么遍历

int count = this.VisualChildrenCount;

            if (count > 0)
{
UIElement child = (UIElement)(this.GetVisualChild(0));
if (child != null)
{
child.Measure(constraint);
return child.DesiredSize;
}
}

wpf布局递归的更多相关文章

  1. WPF快速入门系列(1)——WPF布局概览

    一.引言 关于WPF早在一年前就已经看过<深入浅出WPF>这本书,当时看完之后由于没有做笔记,以至于我现在又重新捡起来并记录下学习的过程,本系列将是一个WPF快速入门系列,主要介绍WPF中 ...

  2. 学习WPF——WPF布局——了解布局容器

    WPF布局工作内部原理 WPF渲染布局时主要执行了两个工作:测量和排列 测量阶段,容器遍历所有子元素,并询问子元素所期望的尺寸 排列阶段,容器在合适的位置放置子元素,并设置元素的最终尺寸 这是一个递归 ...

  3. WPF布局系统[转]

    转自:http://www.cnblogs.com/niyw/archive/2010/10/31/1863908.html前言 前段时间忙了一阵子Google Earth,这周又忙了一阵子架构师论文 ...

  4. 对比MFC资源文件谈谈WPF布局方式

    对比MFC资源文件谈谈WPF布局方式 MFC方式 对于传统的MFC基于UI的应用程序设计通常分两步走,首先是设计UI,使用的是RC文件,然后是代码文件,对RC文件进行操作,如下面Figure 1 的基 ...

  5. WPF 布局总结

    一.WPF布局原理 WPF窗口只能包含单个元素,为在WPF窗口中放置多个元素,需要放置一个容器,让后在容器中添加其他元素.“理想的”WPF窗口需遵循以下几个原则: 1.不应显示设定元素的尺寸.元素应当 ...

  6. 浅谈 WPF布局

    我们首先来了解一下图形化用户界面(Graphic User Interface)也就是我们常常听到的GUI.举个简单的例子,同样是数据,我们可以用控制台程序加格式控制符等输出,但是这些都不如GUI来的 ...

  7. 意外地解决了一个WPF布局问题

    原文:意外地解决了一个WPF布局问题 今天做了一个小测试,意外地将之前的一个困扰解决了,原问题见<WPF疑难杂症会诊>中的“怎么才能禁止内容撑大容器?” 以前我是在外侧嵌套Canvas容器 ...

  8. WPF布局控件与子控件的HorizontalAlignment/VerticalAlignment属性之间的关系

    WPF布局控件与子控件的HorizontalAlignment/VerticalAlignment属性之间的关系: 1.Canvas/WrapPanel控件: 其子控件的HorizontalAlign ...

  9. WPF 10天修炼 第四天- WPF布局容器

    WPF布局 WPF的窗口也就是Window类,是一个内容控件,该控件派生自ContentControl.内容控件有一个Content属性,该属性有一个限制,只能放置一个用户界面元素,或一个字符串.为了 ...

  10. WPF布局控件常用属性介绍

    WPF布局控件常用属性介绍 其它 | 作者:慧都控件网 | 2011-04-06 13:41:57| 阅读 0次 有用(0) 评论(0)   概述:WPF布局控件都是派生自System.Windows ...

随机推荐

  1. OpenHarmony社区运营报告(2023年12月)

      • 截至2023年12月22日,OpenAtom OpenHarmony(简称"OpenHarmony")社区累计超过6700名贡献者,产生26.9万多个PR,2.4万多个St ...

  2. C# Lock的用法

    当我们使用线程的时候,效率最高的方式当然是异步,即各个线程同时运行,其间不相互依赖和等待.但当不同的线程都需要访问某个资源的时候,就需要同步机制了,也就是说当对同一个资源进行读写的时候,我们要使该资源 ...

  3. 华为帐号为AITO问界M5助力,打造懂你的智能座舱

    12月23日,在华为冬季旗舰新品发布会上,AITO问界M5正式发布.华为赋能的AITO问界M5搭载HUAWEI DriveONE纯电驱增程平台和HarmonyOS智能座舱,并且带来华为终端云服务软硬协 ...

  4. 【直播预告】HarmonyOS极客松赋能直播第二期:数据库与网络连接开发

  5. 面试连环炮系列(二十六):什么情况下JVM频繁发生full GC

    1. 什么情况下JVM频繁发生full GC? full gc触发条件是老年代空间不足,具体原因有四个: 系统并发高.执行耗时长或者创建对象过多,导致 young gc频繁,且gc后存活对象太多,但是 ...

  6. web 报表工具如何自适应

    现在的报表用户已经不再将报表作为一个单纯的报表工具看待了,有时候也会当作页面工具来使用,这时为了页面显示工整美观,就需要报表能够自适应宽度.下面我们就基于润乾报表来讲一下是如何做到自适应展现报表. 产 ...

  7. webpack 配置热更新

    正文 代码 const path=require('path'); module.exports={ devtool:'', entry:{ entry:'./src/entry.js', entry ...

  8. 一文读懂IoU,GIoU, DIoU, CIoU, Alpha-IoU (代码非常优雅)

    IoU就是就是我们说的交并比 Intersection over Union ,具体就是两个box的交集除以并集. 当我们计算我们的anchors 或者 proposals 与 ground trut ...

  9. Detectron2环境配置+Ubantu+CUDA10.1+pytorch1.7.0

    Detectron2环境配置 1.创建detectron2 conda环境 conda create -n detectron2 python=3.7 2.激活detectron2 conda环境 c ...

  10. 实训篇-Html-列表练习

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...