[{"data":1,"prerenderedAt":304},["ShallowReactive",2],{"page-\u002Fcsharp\u002Favalonia\u002F源码解读\u002F开头":3},{"id":4,"title":5,"body":6,"description":12,"extension":297,"meta":298,"navigation":299,"path":300,"seo":301,"stem":302,"__hash__":303},"content\u002Fcsharp\u002FAvalonia\u002F源码解读\u002F开头.md","开头",{"type":7,"value":8,"toc":290},"minimark",[9,13,16,95,98,103,161,164,190,192,196,265,268],[10,11,12],"p",{},"我一开始是打算用skia和yoga配合c++来完成我自己的ui组件库，由于我本身是很熟悉C#的，因此我打算学习现在最流行的跨平台组件库Avalonia，来看看他们是怎么实现的组件绘制的。",[10,14,15],{},"这个流程预计会非常的长，但是不会仔细阅读所有的部分，只是说我会截取自己感兴趣的地方和需要借鉴的地方。",[17,18,19,32],"table",{},[20,21,22],"thead",{},[23,24,25,29],"tr",{},[26,27,28],"th",{},"文件",[26,30,31],{},"作用",[33,34,35,65,75],"tbody",{},[23,36,37,44],{},[38,39,40],"td",{},[41,42,43],"code",{},"LogicalTree\u002FILogical.cs",[38,45,46,47,50,51,54,55,50,58,61,62],{},"逻辑节点契约：",[41,48,49],{},"LogicalParent"," \u002F ",[41,52,53],{},"LogicalChildren","、是否已挂到根树、",[41,56,57],{},"AttachedToLogicalTree",[41,59,60],{},"DetachedFromLogicalTree","、",[41,63,64],{},"Notify*",[23,66,67,72],{},[38,68,69],{},[41,70,71],{},"LogicalTree\u002FILogicalRoot.cs",[38,73,74],{},"逻辑树根标记（空接口，语义是「整棵逻辑树的根」）",[23,76,77,82],{},[38,78,79],{},[41,80,81],{},"LogicalTree\u002FLogicalTreeAttachmentEventArgs.cs",[38,83,84,85,61,88,61,91,94],{},"逻辑树挂载\u002F卸载时带的参数（",[41,86,87],{},"Root",[41,89,90],{},"Source",[41,92,93],{},"Parent","）",[96,97],"hr",{},[99,100,102],"h3",{"id":101},"_2-逻辑树真正实现核心","2. 逻辑树：真正实现（核心）",[17,104,105,113],{},[20,106,107],{},[23,108,109,111],{},[26,110,28],{},[26,112,31],{},[33,114,115],{},[23,116,117,122],{},[38,118,119],{},[41,120,121],{},"StyledElement.cs",[38,123,124,127,128,61,130,61,132,135,136,139,140,50,143,146,147,61,149,61,151,61,154,61,157,160],{},[41,125,126],{},"ILogical"," 的落地：",[41,129,93],{},[41,131,53],{},[41,133,134],{},"_logicalRoot","、何时算 ",[41,137,138],{},"IsAttachedToLogicalTree","、向下广播 ",[41,141,142],{},"NotifyAttachedToLogicalTree",[41,144,145],{},"NotifyDetachedFromLogicalTree","。读的时候可搜 ",[41,148,126],{},[41,150,53],{},[41,152,153],{},"NotifyAttached",[41,155,156],{},"SetParent",[41,158,159],{},"FindLogicalRoot"," 等分段看，文件很长不必一次通读。",[10,162,163],{},"逻辑树上的遍历辅助：",[17,165,166,174],{},[20,167,168],{},[23,169,170,172],{},[26,171,28],{},[26,173,31],{},[33,175,176],{},[23,177,178,183],{},[38,179,180],{},[41,181,182],{},"LogicalTree\u002FLogicalExtensions.cs",[38,184,185,186,189],{},"祖先\u002F后代遍历、",[41,187,188],{},"GetLogicalParent"," 等扩展方法",[96,191],{},[99,193,195],{"id":194},"_3-可视树与渲染命中相关第二层树","3. 可视树：与渲染、命中相关（第二层树）",[17,197,198,206],{},[20,199,200],{},[23,201,202,204],{},[26,203,28],{},[26,205,31],{},[33,207,208,238,251],{},[23,209,210,215],{},[38,211,212],{},[41,213,214],{},"Visual.cs",[38,216,217,61,220,61,223,226,227,50,230,233,234,237],{},[41,218,219],{},"VisualParent",[41,221,222],{},"_visualParent",[41,224,225],{},"VisualChildren","、可视子集合变更、",[41,228,229],{},"AttachedToVisualTree",[41,231,232],{},"DetachedFromVisualTree","、与 ",[41,235,236],{},"PresentationSource"," \u002F 渲染器的衔接（例如挂到已附着父节点时的处理）。这是「屏幕上那一棵」的主实现。",[23,239,240,245],{},[38,241,242],{},[41,243,244],{},"VisualTreeAttachmentEventArgs.cs",[38,246,247,248,250],{},"可视树挂载参数（根可视、",[41,249,236],{}," 等）",[23,252,253,258],{},[38,254,255],{},[41,256,257],{},"VisualTree\u002FVisualExtensions.cs",[38,259,260,261,264],{},"可视树遍历：祖先距离、公共祖先、",[41,262,263],{},"GetVisualAncestors","、与布局\u002F坐标相关的辅助等",[10,266,267],{},"可选（遇到「子树挂到别处」时再读）：",[17,269,270,278],{},[20,271,272],{},[23,273,274,276],{},[26,275,28],{},[26,277,31],{},[33,279,280],{},[23,281,282,287],{},[38,283,284],{},[41,285,286],{},"VisualTree\u002FIHostedVisualTreeRoot.cs",[38,288,289],{},"托管可视子",{"title":291,"searchDepth":292,"depth":292,"links":293},"",2,[294,296],{"id":101,"depth":295,"text":102},3,{"id":194,"depth":295,"text":195},"md",{},true,"\u002Fcsharp\u002Favalonia\u002F源码解读\u002F开头",{"description":12},"csharp\u002FAvalonia\u002F源码解读\u002F开头","PtI9VEK59N9DgS63hbqqCWVaaGFszdGbsjh3fOl56mU",1791042464956]