Skip to content

Grid是我们使用最多的一个WPF容器,可是它的实际布局方式却并没有这么简单。

比较遗憾的是我没有在里面找到Task.Yield的合适的应用场景。关于Task.Yield的应用场景也是争论纷纷,可见这个东西必然很鸡肋。本文尝试了Task.Yield的几种使用场景,看看是否能够将代码变得更加优雅。

坐在MVP旁边狗尾续貂,诚惶诚恐。。

如果你还不知道Grid有什么样神奇的用法,可以先看看毅仔的WPF/UWP 的 Grid 布局竟然有 Bug,还不止一个!了解 Grid 中那些未定义的布局规则 - walterlv,刷新一下WPF观

FrameworkElement布局

FrameworkElement的布局分为2部MeasureOverrideArrangeOverride

MearsureOverride用于测量所有元素需要多少空间,而ArrangeOverride则是确定这些元素应该怎么摆放

MearsureOverride的过程是一个深度优先的遍历过程。在一定的可用空间下,父元素根据自身的布局规则,向其子元素传入指定大小的可用空间,获得子元素的测量尺寸后,将其结合其布局规则,返回自身的测量尺寸。

所以想要获得 一个元素的测量尺寸,必须向测量子元素的尺寸

此外还需要注意的是FrameworkElement定义了对齐方式HorizontalAlignmentVerticalAlignment

如果他们的值是Stretch,在布局时,会使用slot size而不是自己MeasureOverride获得的DesiredSize

Grid布局

那么Grid是如何布局的呢?

布局Grid关键是如何获取各个GridCell的尺寸

对于Grid,它的行宽和列高可以设置3种值:绝对值,Auto和*

绝对值就是直接按数值传入可用空间的约束,

Auto是指以现有约束传入,按照子元素大小布局

*是指以剩余空间按*等分作为约束传入

参考链接:

最后更新于:

基于 VitePress + @sugarat/theme 构建