1

我一直在寻找这样的解释,但我还没有找到。问题是我想知道 Wpf 控件的初始化/创建过程的步骤。

让我们使用一个简单的 Button,我想知道调用构造函数时发生了什么,何时将控件添加到 visualTree/logicalTree,何时调用依赖属性值,何时调用 ApplyTemplate()?

我需要这些信息才能编写正确的自定义控件,我认为这也会对其他人有所帮助,以防他们想知道为什么 this.Template.FindName("test") 在控件的构造函数中被调用时总是返回“null”。

任何人都可以回答这个问题或向我提供教程链接,其中详细解释了初始化控件的概念吗?

谢谢 :)

4

1 回答 1

1

根据这个 SO answer here

创建和显示窗口时的事件序列

根据要求,以下是创建和显示窗口时 WPF 中的主要事件序列:

  1. 在创建对象时调用构造函数和 getter/setter,包括正在更新的对象以及从它们继承的任何对象上的 PropertyChangedCallback、ValidationCallback 等

  2. 当每个元素被添加到可视化或逻辑树时,它的 Intialized 事件会被触发,这会导致除了您可以定义的任何特定于元素的初始化之外,还可以找到样式和触发器 [注意:不会为逻辑树中的叶子触发初始化事件如果根目录下没有 PresentationSource(例如 Window)]

  3. 窗口及其上所有未折叠的视觉对象都是测量的,这会在每个控件上产生一个 ApplyTemplate,这会导致额外的对象树构造,包括更多的构造函数和 getter/setter

  4. 窗口及其上所有未折叠的视觉对象均已排列

  5. 窗口及其后代(逻辑和视觉)接收到 Loaded 事件

  6. 任何在首次设置时失败的数据绑定都会重试

  7. 窗口及其后代有机会以视觉方式呈现其内容

步骤 1-2 在创建窗口时完成,无论它是否显示。其他步骤通常在显示窗口之前不会发生,但如果手动触发它们可以更早发生。

另外,我个人发现DispatcherPriority Enum在某些情况下对确定事件顺序很有用

  • 无效的
  • 不活跃
  • 系统空闲
  • 应用空闲
  • 上下文空闲
  • 背景
  • 输入
  • 已加载
  • 使成为
  • 数据绑定
  • 正常- 构造函数在这里运行
  • 发送
于 2012-12-13T14:00:08.953 回答