一、WPF 布局原则

WinForm的布局是采用基于坐标的方式,当窗口内容发生变化时,里面的控件不会随之动态调整,用户体验不够好。而WPF采用了基于流的布局方式,像Web开发模式。流式布局特点是:所有的元素总是默认地自动向左上角靠近,在设计时,通过控制元素相对位置的方式使其达到预计的效果,即元素的位置依赖于相邻元素的位置和尺寸。

二、两段布局

两段布局是指在两个完全不同的阶段来确定控件的最佳尺寸。在这两个阶段布局模型让父布局控件和子控件达成元素最后尺寸的约定。两个阶段分别是测量(Measure) 和排列(Arrange) 。测量阶段需要做的主要工作是:对整个UI页面的检测,并询问每个元素的期望尺寸(Desired Size) ,元素返回一个可用的尺寸(Avilable Size),当所有的元索都被询问并测量好以后,就进入到排列阶段。在排列阶段,父元素通知每个子元素的实际尺寸(Actual Size)和位置。在两段布局中。父元素和子元素需要协商出需要的尺寸大小,涉及可用尺寸 ,期望尺寸、实际尺寸,在此辨析3个尺寸。其中,可用尺寸是测量阶段的初始约束值,即父元素愿意给子元素的最大空间值;期望尺寸是子元素想要的尺寸;实际尺寸是父元元素分配给子元素的最终尺寸。这3个尺寸要符合下面的不等式条件:

    Desired Size ≤ Actual Size ≤ Available Size

了解WPF合成布局模型,学习WPF布局机制,才能理解合成布局模型的来龙去陆页面布局时做到得心应手。

三、测量(Measure)和排列(arrange)

  我们已经知道,WPF界面上的每个元素的边界框尺寸和排列是WPF自动计算出来的。那么这个智能布局的过程是怎么样呢?两个步骤:measure and arrange. Layout系统要为每个Panel中的每个子元素进行这两个步骤的处理。由于Panel是可以嵌套的,可以推断这是个递归的处理过程。Layout处理的过程如下图所示:

 

我们在学习WPF框架的时候已经知道,所有UI元素的根元素是UIElement类型,UIElement中定义了一些基本的关于UI显示的属性(如clip和Visibility)。在UIElement.Measure(Size availableSize)方法执行阶段,就是要对这些基本属性做评估,得到合适的Size。同样,FrameworkElement.MeasureCore(Size availableSize)方法评估在FrameworkElement中定义且有可能影响UI布局的属性,得出更合适的Size。这个Size将被传递给FrameworkElement.MeasureOverride(Size availableSize),WPF提供的Panel类型(如Grid)中就会重写该方法来处理,处理完后将得到一个系统期望的Size(可称之为DesiredSize),Layout系统将按照这个Size来显示该Element。到此测量(Measure)阶段结束。当Size确定以后,把Size包装为Rect实例,传递给UIElement.Arrange(Rect finalRect),开始进行排列(arrange)处理,根据Size参数,Arrange方法将为元素创建边界框(就是第一节说的那个元素边界框),边框信息将会打包到Rect实例传递给FrameworkElement.ArrangeCore(Rect finalRect),ArrangeCore将继续评估DesiredSize,将会计算边界留白(Margin,Pading..)等信息,得到arrangeSize,并传递FrameworkElement.ArrangeOverride(Size finalSize),这个方法又是可重写的,WPF提供的Panel类型(如Grid)中就会重写该方法来处理,最终得到finalSize。得到finalSize后,ArrangeOverride执行完毕,控制权回到ArrangeCore方法,ArrangeCore把该Element放到它的边界框中。到此,该Element的Layout处理完成。
————————————————
版权声明:本文为CSDN博主「简单的绿竹」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zunguitiancheng/article/details/126158680

 

原文地址:http://www.cnblogs.com/cdaniu/p/16928922.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性