控制创建过程的步骤WPF

时间:2012-12-13 12:19:40

标签: wpf wpf-controls

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

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

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

任何人都可以回答这个问题,或者向我提供教程的链接,其中对启动控件的概念进行了适当的解释吗?

谢谢:)

1 个答案:

答案 0 :(得分:1)

this SO answer here

  

创建并显示Window时的事件序列

     

根据要求,这是WPF中的主要事件序列   窗口已创建并显示:

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

  2.   
  3. 当每个元素被添加到可视或逻辑树时,会触发其初始化事件,这会导致样式和触发器成为   发现应用除了任何特定于元素的初始化你   可以定义[注意:逻辑中的叶子不会触发初始化事件   树,如果根源没有PresentationSource(例如Window)

  4.   
  5. 窗口和所有未折叠的Visuals都是Measured,这会导致每个Control上的ApplyTemplate,这会导致额外的   对象树构造包括更多构造函数和   getter / setter方法

  6.   
  7. 窗口及其上所有未折叠的视觉效果都是“已安排”

  8.   
  9. 窗口及其后代(逻辑和可视)接收Loaded事件

  10.   
  11. 重试首次设置失败的任何数据绑定

  12.   
  13. 窗口及其后代有机会直观地呈现其内容

  14.         

    创建Window时完成步骤1-2,无论是否为   所示。其他步骤通常直到Window才会发生   显示,但如果手动触发,它们可以更早发生。

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

  • 无效
  • 无效
  • SystemIdle
  • ApplicationIdle
  • ContextIdle
  • 背景
  • 输入
  • 加载
  • 渲染
  • 的DataBind
  • 正常 - 构造函数在此处运行
  • 发送