开头

我一开始是打算用skia和yoga配合c++来完成我自己的ui组件库,由于我本身是很熟悉C#的,因此我打算学习现在最流行的跨平台组件库Avalonia,来看看他们是怎么实现的组件绘制的。

这个流程预计会非常的长,但是不会仔细阅读所有的部分,只是说我会截取自己感兴趣的地方和需要借鉴的地方。

文件作用
LogicalTree/ILogical.cs逻辑节点契约:LogicalParent / LogicalChildren、是否已挂到根树、AttachedToLogicalTree / DetachedFromLogicalTree、Notify*
LogicalTree/ILogicalRoot.cs逻辑树根标记(空接口,语义是「整棵逻辑树的根」)
LogicalTree/LogicalTreeAttachmentEventArgs.cs逻辑树挂载/卸载时带的参数(Root、Source、Parent)

2. 逻辑树:真正实现(核心)

文件作用
StyledElement.csILogical 的落地:Parent、LogicalChildren、_logicalRoot、何时算 IsAttachedToLogicalTree、向下广播 NotifyAttachedToLogicalTree / NotifyDetachedFromLogicalTree。读的时候可搜 ILogical、LogicalChildren、NotifyAttached、SetParent、FindLogicalRoot 等分段看,文件很长不必一次通读。

逻辑树上的遍历辅助:

文件作用
LogicalTree/LogicalExtensions.cs祖先/后代遍历、GetLogicalParent 等扩展方法

3. 可视树:与渲染、命中相关(第二层树)

文件作用
Visual.csVisualParent、_visualParent、VisualChildren、可视子集合变更、AttachedToVisualTree / DetachedFromVisualTree、与 PresentationSource / 渲染器的衔接(例如挂到已附着父节点时的处理)。这是「屏幕上那一棵」的主实现。
VisualTreeAttachmentEventArgs.cs可视树挂载参数(根可视、PresentationSource 等)
VisualTree/VisualExtensions.cs可视树遍历:祖先距离、公共祖先、GetVisualAncestors、与布局/坐标相关的辅助等

可选(遇到「子树挂到别处」时再读):

文件作用
VisualTree/IHostedVisualTreeRoot.cs托管可视子