Avalonia Grid 控件源码如何为?
摘要:在各类XAML UI框架中,Grid 是一种非常灵活且常用的布局控件,它可以创建复杂的用户界面布局。Grid 允许开发者通过定义行和列来组织界面元素,每个元素可以精确地放置在网格的特定区域内
本文以 Avalonia 框架为
在各类XAML UI框架中,Grid 是一种非常灵活且常用的布局控件,它可以创建复杂的用户界面布局。Grid 允许开发者通过定义行和列来组织界面元素,每个元素可以精确地放置在网格的特定区域内
本文以 Avalonia 框架为例,讲解 Grid 控件的工作原理
事实上,UWP、WinUI 3 和 Avalonia 等XAML框架中 Grid 控件的源码全都源自于 WPF 中的实现,以至于绝大部分代码乃至注释都是相同的
因此,本文中你能了解到的机制也可应用于其他 XAML UI 框架
Measure 阶段
快速路径:当仅仅存在一个行/列(或未定义行列)时,将子元素中最大的宽和高设置为为 Grid 的大小即可。
gridDesiredSize = new Size(
Math.Max(gridDesiredSize.Width, child.DesiredSize.Width),
Math.Max(gridDesiredSize.Height, child.DesiredSize.Height));
在一般情况下,我们定义了两个及以上以上的行/列,就需要一套特定的算法进行计算
我们知道,Grid的行/列定义有Auto、Star、Pixel三类
简化后的定义如下:
public class Definition
{
public double MinSize { get; set; }// 对应MinHeight(MinWidth),以Pixel为单位
public double MaxSize { get; set; }// 对应MaxHeight(MaxWidth),以Pixel为单位
public GridLength Size { get; set; }// 对应Height(Width),对应不同单位下的值
double MeasureSize { get; set; }// 测量阶段的结果
double FinalSize { get; set; }// 排列阶段的结果
double FinalOffset { get; set; }// 最终偏移量
}
此处将 Width/Height 更改为 Size,不再区分行列
源代码中为了性能,上面的一些属性(如FinalSize、MaxSize)使用的是同一个字段,为便于理解,这里将他们拆分开来单独列出。具体代码可以自行前往Avalonia存储库查看
在测量 (Measure) 的过程中,Grid 遵循"可确定大小优先"的原则。
