我一直在寻找这样的解释,但我还没找到。问题是我想知道Wpf控件的初始化/创建过程的步骤。
让我们看一个简单的Button,我想知道在调用构造函数时发生了什么,何时将控件添加到visualTree / logicalTree,何时调用dependencyproperty值,何时调用ApplyTemplate()?
我需要这些信息才能编写正确的自定义控件,我认为它会帮助其他人,以防他们想知道为什么this.Template.FindName(“test”)总是在构造函数中调用时返回“null”控制。
任何人都可以回答这个问题,或者向我提供教程的链接,其中对启动控件的概念进行了适当的解释吗?
谢谢:)
答案 0 :(得分:1)
创建并显示Window时的事件序列
根据要求,这是WPF中的主要事件序列 窗口已创建并显示:
在创建对象时调用构造函数和getter / setter,包括PropertyChangedCallback,ValidationCallback等 正在更新的对象以及从中继承的任何对象
当每个元素被添加到可视或逻辑树时,会触发其初始化事件,这会导致样式和触发器成为 发现应用除了任何特定于元素的初始化你 可以定义[注意:逻辑中的叶子不会触发初始化事件 树,如果根源没有PresentationSource(例如Window)
窗口和所有未折叠的Visuals都是Measured,这会导致每个Control上的ApplyTemplate,这会导致额外的 对象树构造包括更多构造函数和 getter / setter方法
窗口及其上所有未折叠的视觉效果都是“已安排”
窗口及其后代(逻辑和可视)接收Loaded事件
重试首次设置失败的任何数据绑定
- 醇>
窗口及其后代有机会直观地呈现其内容
创建Window时完成步骤1-2,无论是否为 所示。其他步骤通常直到Window才会发生 显示,但如果手动触发,它们可以更早发生。
另外,我个人发现DispatcherPriority Enum在某些情况下确定事件顺序很有用