[{"data":1,"prerenderedAt":447},["ShallowReactive",2],{"page-\u002Fcsharp\u002Favalonia\u002F控件的生命周期":3},{"id":4,"title":5,"body":6,"description":413,"extension":440,"meta":441,"navigation":442,"path":443,"seo":444,"stem":445,"__hash__":446},"content\u002Fcsharp\u002FAvalonia\u002F控件的生命周期.md","控件的生命周期",{"type":7,"value":8,"toc":412},"minimark",[9,14,29,38,48,54,71,76,87,97,107,114,124,128,139,144,151,170,173,179,182,188,204,209,221,226,246,252,267,273,284,290,296,303,314,317,338,345,358,365,376,383,390,406,409],[10,11,13],"h2",{"id":12},"usercontrol-的生命周期","UserControl 的生命周期",[15,16,17,21,22,25,26,28],"p",{},[18,19,20],"code",{},"UserControl"," 继承自 ",[18,23,24],{},"Control",",因此它的生命周期与所有 ",[18,27,24],{}," 类型相同。主要的生命周期事件包括:",[30,31,33,34],"h3",{"id":32},"_1loaded-事件","1. ",[35,36,37],"strong",{},"Loaded 事件",[15,39,40,43,44,47],{},[18,41,42],{},"Loaded"," 事件在",[35,45,46],{},"控件完全构建在可视树中,并且布局和渲染都完成后触发","。 Control.cs:174-183",[15,49,50,53],{},[35,51,52],{},"触发时机",":",[55,56,57,65,68],"ul",{},[58,59,60,61,64],"li",{},"控件附加到可视树后(",[18,62,63],{},"OnAttachedToVisualTreeCore",") Control.cs:382-389",[58,66,67],{},"控件模板已应用,模板中创建的对象引用可用",[58,69,70],{},"这是控件创建生命周期中最晚的时机",[15,72,73,53],{},[35,74,75],{},"实现机制",[15,77,78,79,82,83,86],{},"控件附加到可视树时会调用 ",[18,80,81],{},"ScheduleOnLoadedCore()",",将",[35,84,85],{},"控件添加到加载队列中",": Control.cs:294-308",[15,88,89,90,93,94,96],{},"加载队列会在 ",[18,91,92],{},"Dispatcher"," 的 ",[18,95,42],{}," 优先级上批量处理,以提高性能: Control.cs:260-288",[15,98,99,100,103,104,106],{},"最终调用 ",[18,101,102],{},"OnLoadedCore()"," 触发 ",[18,105,42],{}," 事件: Control.cs:314-328",[30,108,110,111],{"id":109},"_2unloaded-事件","2. ",[35,112,113],{},"Unloaded 事件",[15,115,116,119,120,123],{},[18,117,118],{},"Unloaded"," 事件在控件",[35,121,122],{},"从可视树中移除时触发","。 Control.cs:190-201",[15,125,126,53],{},[35,127,52],{},[55,129,130,133],{},[58,131,132],{},"控件从可视树分离时",[58,134,135,136,138],{},"与 ",[18,137,42],{}," 对称,用于清理资源",[15,140,141,143],{},[35,142,75],{},": Control.cs:334-352",[30,145,147,148],{"id":146},"_3window-的特殊处理","3. ",[35,149,150],{},"Window 的特殊处理",[15,152,153,156,157,160,161,163,164,166,167,169],{},[18,154,155],{},"Window"," 和 ",[18,158,159],{},"WindowBase"," 作为可视树根节点,不会触发 ",[18,162,63],{},",因此需要手动调度 ",[18,165,42],{},"\u002F",[18,168,118],{}," 事件: WindowBase.cs:208-227",[15,171,172],{},"在Control被挂载到可视树之前，会有以下几个关键的生命周期阶段：",[30,174,33,176],{"id":175},"_1构造函数-constructor",[35,177,178],{},"构造函数 (Constructor)",[15,180,181],{},"控件实例化时调用,这是生命周期的起点。",[30,183,110,185],{"id":184},"_2begininit-endinit",[35,186,187],{},"BeginInit() \u002F EndInit()",[15,189,190,21,192,195,196,199,200],{},[18,191,24],{},[18,193,194],{},"StyledElement",",实现了 ",[18,197,198],{},"ISupportInitialize"," 接口。",[201,202,203],"span",{},"link to Repo AvaloniaUI\u002FAvalonia: src\u002FAvalonia.Base\u002FStyledElement.cs:350-368",[15,205,206,53],{},[35,207,208],{},"BeginInit()",[55,210,211,214],{},[58,212,213],{},"在 XAML 解析开始时调用",[58,215,216,217,220],{},"增加 ",[18,218,219],{},"_initCount"," 计数器,表示初始化开始",[15,222,223,53],{},[35,224,225],{},"EndInit()",[55,227,228,234,240],{},[58,229,230,231],{},"在 XAML 解析完成、所有",[35,232,233],{},"属性设置后调用",[58,235,236,237,239],{},"减少 ",[18,238,219],{}," 计数器",[58,241,242,243,245],{},"当 ",[18,244,219],{}," 为 0 且控件已附加到逻辑树时,会触发样式应用和初始化",[15,247,248,249],{},"测试代码验证了初始化顺序:",[201,250,251],{},"link to Repo AvaloniaUI\u002FAvalonia: tests\u002FAvalonia.Markup.Xaml.UnitTests\u002FXaml\u002FBasicTests.cs:686-708",[15,253,254,255,258,259,262,263,266],{},"控件会在附加到父控件",[35,256,257],{},"之后","、最终 ",[18,260,261],{},"EndInit"," ",[35,264,265],{},"之前","被添加到逻辑树。",[30,268,147,270],{"id":269},"_3attachedtologicaltree",[35,271,272],{},"AttachedToLogicalTree",[15,274,275,276,279,280,283],{},"控件",[35,277,278],{},"附加到逻辑树时触发",",发生在",[35,281,282],{},"附加到可视树之前","。",[15,285,286,287],{},"测试验证了顺序:",[201,288,289],{},"link to Repo AvaloniaUI\u002FAvalonia: tests\u002FAvalonia.Markup.Xaml.UnitTests\u002FXaml\u002FBasicTests.cs:663-684",[15,291,292,293,295],{},"控件会在属性设置",[35,294,265],{},"被添加到父控件。",[30,297,299,300],{"id":298},"_4applystyling","4. ",[35,301,302],{},"ApplyStyling()",[15,304,305,306,308,309,283,311],{},"在 ",[18,307,225],{}," 中,如果控件已附加到逻辑树,会调用 ",[18,310,302],{},[201,312,313],{},"link to Repo AvaloniaUI\u002FAvalonia: src\u002FAvalonia.Base\u002FStyledElement.cs:381-414",[15,315,316],{},"这个方法会:",[55,318,319,326,332],{},[58,320,321,322,325],{},"应用控件主题 (",[18,323,324],{},"ApplyControlTheme",")",[58,327,328,329,325],{},"应用模板化父控件主题 (",[18,330,331],{},"ApplyTemplatedParentControlTheme",[58,333,334,335,325],{},"应用样式 (",[18,336,337],{},"ApplyStyles",[30,339,341,342],{"id":340},"_5initializeifneeded","5. ",[35,343,344],{},"InitializeIfNeeded()",[15,346,347,348,351,352,283,355],{},"在样式应用后调用,设置 ",[18,349,350],{},"IsInitialized"," 为 ",[18,353,354],{},"true",[201,356,357],{},"link to Repo AvaloniaUI\u002FAvalonia: src\u002FAvalonia.Base\u002FStyledElement.cs:416-420",[30,359,361,362],{"id":360},"_6oninitialized","6. ",[35,363,364],{},"OnInitialized()",[15,366,242,367,369,370,372,373],{},[18,368,350],{}," 设置为 ",[18,371,354],{}," 后触发的虚方法,子类可以重写。",[201,374,375],{},"link to Repo AvaloniaUI\u002FAvalonia: src\u002FAvalonia.Base\u002FStyledElement.cs:614-616",[30,377,379,380],{"id":378},"_7onattachedtovisualtreecore","7. ",[35,381,382],{},"OnAttachedToVisualTreeCore()",[15,384,385,386,389],{},"控件附加到可视树时调用。",[201,387,388],{},"link to Repo AvaloniaUI\u002FAvalonia: src\u002FAvalonia.Controls\u002FControl.cs:382-389","\n这个方法会:",[55,391,392,398],{},[58,393,394,395,397],{},"调用 ",[18,396,344],{}," 确保控件已初始化",[58,399,394,400,402,403,405],{},[18,401,81],{}," 安排 ",[18,404,42],{}," 事件",[10,407,408],{"id":408},"完整的挂载前生命周期顺序",[15,410,411],{},"![[Pasted image 20251108222519.png]]",{"title":413,"searchDepth":414,"depth":414,"links":415},"",2,[416,439],{"id":12,"depth":414,"text":13,"children":417},[418,421,423,425,427,429,431,433,435,437],{"id":32,"depth":419,"text":420},3,"1. Loaded 事件",{"id":109,"depth":419,"text":422},"2. Unloaded 事件",{"id":146,"depth":419,"text":424},"3. Window 的特殊处理",{"id":175,"depth":419,"text":426},"1. 构造函数 (Constructor)",{"id":184,"depth":419,"text":428},"2. BeginInit() \u002F EndInit()",{"id":269,"depth":419,"text":430},"3. AttachedToLogicalTree",{"id":298,"depth":419,"text":432},"4. ApplyStyling()",{"id":340,"depth":419,"text":434},"5. InitializeIfNeeded()",{"id":360,"depth":419,"text":436},"6. OnInitialized()",{"id":378,"depth":419,"text":438},"7. OnAttachedToVisualTreeCore()",{"id":408,"depth":414,"text":408},"md",{},true,"\u002Fcsharp\u002Favalonia\u002F控件的生命周期",{"description":413},"csharp\u002FAvalonia\u002F控件的生命周期","OmvalMzKeDR09TmkohnFYP4Shp1CpaldP35vNb73-GU",1791042464932]