首页 > 其他分享 >【WPF】布局 测量和排序

【WPF】布局 测量和排序

时间:2022-11-27 05:33:14浏览次数:36  
标签:控件 元素 布局 测量 尺寸 WPF 排序 Size

概览

 

 

 

 

 

一、WPF 布局原则

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

二、合成布局元素

WPF的合成布局模型是用来满足广泛的应用场景布局,允许某种布局控件被嵌套在其他布局控件中。合成布局模型通过布局契约来实现子控件和父布局控件间的通信问题。布局契约包括两种设计思想,即根据内容调整尺寸和两段布局。
1.根据内容调整尺寸
根据内容调整尺寸,即每个控件都根据内容来确定控件大小,这个设计思想应用于UI中的所有控件。例如,窗口能够调整大小来适应它们内部的控件,文本框控件能调整尺寸来适应它内部的文本。当然每个元素会被询问其期望的尺寸大小,以确保根据内容调整尺寸的设计思想能够实施。

2.两段布局

两段布局是指在两个完全不同的阶段来确定控件的最佳尺寸。在这两个阶段布局模型让父布局控件和子控件达成元素最后尺寸的约定。两个阶段分别是测量(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

 

标签:控件,元素,布局,测量,尺寸,WPF,排序,Size
From: https://www.cnblogs.com/cdaniu/p/16928922.html

相关文章

  • 剑指offer——Day16 排序(简单)
    Day162022.11.22排序(简单)45.把数组排成最小的数自己实现没有思路题解也是比较大小,只是这个比较大小的方法是两个数字字符串stringx和stringy,如果x+y<y+x,说明x应该......
  • 排序整合(1)
    冒泡排序基本思想第i(i=1,2,…)趟排序时从序列中前n-i+1个元素的第1个元素开始,相邻两个元素进行比较,若前者大于后者,两者交换位置,否则不交换。代码实现......
  • 基于桶的排序之计数排序
    基于桶的排序之计数排序作者:Grey原文地址:博客园:基于桶的排序之计数排序CSDN:基于桶的排序之计数排序说明基于桶的排序有两种,分别是计数排序和基数排序。但是这两种排......
  • java实现扑克牌游戏(洗牌,发牌,排序)
    packagepoker.bean;importlombok.AllArgsConstructor;importlombok.Getter;importlombok.NoArgsConstructor;importlombok.Setter;importjava.lang.annotatio......
  • 力扣153(java&python)-寻找旋转排序数组中的最小值(中等)
    题目:已知一个长度为n的数组,预先按照升序排列,经由1到n次旋转后,得到输入数组。例如,原数组nums=[0,1,2,4,5,6,7]在变化后可能得到:若旋转4次,则可以得到[4,5,6,......
  • Prism框架(一)——概述Prism框架的设计目的是用来帮助构建丰富、灵活、易维护的WPF和Si.
    SiPrism框架(一)——概述Prism框架的设计目的是用来帮助构建丰富、灵活、易维护的WPF和SiPrism框架(一)——概述Prism框架的设计目的是用来帮助构建丰富、灵活......
  • WPF 样式
    .引言样式(Style),主要是用来让元素或内容呈现一定外观的属性。WPF中的样式的作用,就像Web中的CSS一样,为界面上的元素定制外观,以提供更好的用户界面。在WPF应用程序中,通过控......
  • sort自然排序顺序
    1、问题:fs读取文件夹文件的时候,有时顺序是乱的   而实际想要的顺序是这样的2、思路:主要通过js的数组中的sort方法来处理利用replace正则区分数字与非数字来遍历......
  • [拓扑排序 反向建图] 825E - Minimal Labels
    [拓扑排序编号字典序最小]825E-MinimalLabels题目​​题目链接​​思路这题答案要求节点编号越小,打上的标签越小,即编号序列字典序最小,而非拓扑序列字典序最小。想让当......
  • WPF中的事件及冒泡事件和隧道事件(预览事件)的区别
    WPF的采取了路由事件机制,这样事件可以在可视树上层级传递。要知道XAML中控件都是由很多其他元素组合而成,比如我们单击了Button内部的TextBlock元素,Button依然可以可......