我一直在寻找了一段时间这样的交代,我无法找到任何呢。 问题是,我想知道一个WPF控件初始化/创建过程的步骤。
让我们一个简单的按钮,我想知道发生了什么事时,构造函数被调用,当控件添加到的VisualTree / logicalTree,并DependencyProperty的值的调用发生时,当ApplyTemplate在()叫什么名字?
我需要这些信息来能写正确的自定义控件,我认为这会帮助别人过的情况下,他们想知道为什么this.Template.FindName(“测试”)始终返回“空”被称为控制的构造函数中时。
任何人都可以回答这个问题或提供给我其中initizaling控制的概念poperly解释教程的链接?
谢谢 :)
每本SO这里回答
事件序列被创建并显示一个窗口时
按照要求,这里是WPF重大事件时创建并显示一个窗口的序列:
构造函数和getter / setter方法被称为创建对象,包括PropertyChangedCallback,ValidationCallback等上正在更新的对象,并从他们继承的任何对象
由于每个元素被添加到视觉或逻辑树的Intialized事件被激发,这将导致样式和触发器被发现除了你可以定义[注任何特定元素初始化应用:在逻辑树不解雇叶初始化事件如果没有PresentationSource(例如窗口)在其根部]
窗口并在其上所有的非折叠的视觉效果被测量,这会导致在每个控制,这会导致附加的对象树结构,其包括多个构造和getter / setter方法的ApplyTemplate在
该窗口上的所有未塌缩的视觉效果被安排
窗口及其后代(逻辑和视觉)接收加载事件
当他们失败的第一组的任何数据绑定试
该窗口及其后代有机会直观地呈现其内容
步骤1-2是在创建窗口时完成的,无论它是否被示出。 至于其他的步骤一般不会发生,直到所示的窗口,但如果手动触发他们可以更早发生。
另外,我个人发现的DispatcherPriority枚举有用确定在某些情况下,事件顺序
- 无效
- 待用
- SystemIdle
- ApplicationIdle
- ContextIdle
- 背景
- 输入
- 加载
- 给予
- 的DataBind
- 正常 -构造跑这里来了
- 发送