开头
我一开始是打算用skia和yoga配合c++来完成我自己的ui组件库,由于我本身是很熟悉C#的,因此我打算学习现在最流行的跨平台组件库Avalonia,来看看他们是怎么实现的组件绘制的。
这个流程预计会非常的长,但是不会仔细阅读所有的部分,只是说我会截取自己感兴趣的地方和需要借鉴的地方。
| 文件 | 作用 |
|---|
LogicalTree/ILogical.cs | 逻辑节点契约:LogicalParent / LogicalChildren、是否已挂到根树、AttachedToLogicalTree / DetachedFromLogicalTree、Notify* |
LogicalTree/ILogicalRoot.cs | 逻辑树根标记(空接口,语义是「整棵逻辑树的根」) |
LogicalTree/LogicalTreeAttachmentEventArgs.cs | 逻辑树挂载/卸载时带的参数(Root、Source、Parent) |
| 文件 | 作用 |
|---|
StyledElement.cs | ILogical 的落地:Parent、LogicalChildren、_logicalRoot、何时算 IsAttachedToLogicalTree、向下广播 NotifyAttachedToLogicalTree / NotifyDetachedFromLogicalTree。读的时候可搜 ILogical、LogicalChildren、NotifyAttached、SetParent、FindLogicalRoot 等分段看,文件很长不必一次通读。 |
逻辑树上的遍历辅助:
| 文件 | 作用 |
|---|
LogicalTree/LogicalExtensions.cs | 祖先/后代遍历、GetLogicalParent 等扩展方法 |
| 文件 | 作用 |
|---|
Visual.cs | VisualParent、_visualParent、VisualChildren、可视子集合变更、AttachedToVisualTree / DetachedFromVisualTree、与 PresentationSource / 渲染器的衔接(例如挂到已附着父节点时的处理)。这是「屏幕上那一棵」的主实现。 |
VisualTreeAttachmentEventArgs.cs | 可视树挂载参数(根可视、PresentationSource 等) |
VisualTree/VisualExtensions.cs | 可视树遍历:祖先距离、公共祖先、GetVisualAncestors、与布局/坐标相关的辅助等 |
可选(遇到「子树挂到别处」时再读):
| 文件 | 作用 |
|---|
VisualTree/IHostedVisualTreeRoot.cs | 托管可视子 |