WPF:UIElement以及FrameworkElement中常见事件的运行顺序
2016-03-24 13:03
351 查看
测试如下事件和方法:
UIElement:
OnRender方法。
LayoutUpdated事件。
FrameworkElement:
OnMeasureOverride方法。
OnArrangeOverride方法。
Loaded事件。
Initialized事件。
以及自定义控件中的依赖属性设置。
然后在XAML中创建控件并设置依赖属性:
结果:
所以,当所有属性初始化后,FrameworkElement.Initialized会运行,接着发生控件就要开始显示了,所以WPF的Measure和Arrange的两步布局步骤就开始了,最后OnRender被调用,控件就显示了。然后UIElement.LayoutUpdated控件此时已经显示,最后Loaded事件发生代表所有预处理项已完成。
UIElement:
OnRender方法。
LayoutUpdated事件。
FrameworkElement:
OnMeasureOverride方法。
OnArrangeOverride方法。
Loaded事件。
Initialized事件。
以及自定义控件中的依赖属性设置。
class TestControl: Control { public TestControl() { Loaded += new RoutedEventHandler(TestControl_Loaded); Initialized += new EventHandler(TestControl_Initialized); LayoutUpdated += new EventHandler(TestControl_LayoutUpdated); } #region Prop public static readonly DependencyProperty PropProperty = DependencyProperty.Register("Prop", typeof(bool), typeof(TestControl), new FrameworkPropertyMetadata((bool)false, FrameworkPropertyMetadataOptions.AffectsRender, new PropertyChangedCallback(OnPropChanged), new CoerceValueCallback(CoerceProp))); public bool Prop { get { return (bool)GetValue(PropProperty); } set { SetValue(PropProperty, value); } } private static void OnPropChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { Debug.WriteLine("DP:Changed"); } private static object CoerceProp(DependencyObject d, object value) { Debug.WriteLine("DP:Coerce"); return value; } #endregion void TestControl_LayoutUpdated(object sender, EventArgs e) { Debug.WriteLine("UIElement.LayoutUpdated"); } void TestControl_Initialized(object sender, EventArgs e) { Debug.WriteLine("FrameworkElement.Initialized"); } void TestControl_Loaded(object sender, RoutedEventArgs e) { Debug.WriteLine("FrameworkElement.Loaded"); } protected override Size MeasureOverride(Size constraint) { Debug.WriteLine("FrameworkElement.MeasureOverride"); return base.MeasureOverride(constraint); } protected override Size ArrangeOverride(Size arrangeBounds) { Debug.WriteLine("FrameworkElement.ArrangeOverride"); return base.ArrangeOverride(arrangeBounds); } protected override void OnRender(DrawingContext drawingContext) { Debug.WriteLine("UIElement.OnRender"); base.OnRender(drawingContext); } }
然后在XAML中创建控件并设置依赖属性:
<loc:TestControl Prop="True"/>
结果:
DP:Coerce DP:Changed FrameworkElement.Initialized FrameworkElement.MeasureOverride FrameworkElement.ArrangeOverride UIElement.OnRender UIElement.LayoutUpdated UIElement.LayoutUpdated FrameworkElement.Loaded
所以,当所有属性初始化后,FrameworkElement.Initialized会运行,接着发生控件就要开始显示了,所以WPF的Measure和Arrange的两步布局步骤就开始了,最后OnRender被调用,控件就显示了。然后UIElement.LayoutUpdated控件此时已经显示,最后Loaded事件发生代表所有预处理项已完成。
相关文章推荐
- ubuntu打软件报错
- BZOJ 3638 k-Maximum Subsequence Sum
- Leetcode 128. Longest Consecutive Sequence
- Codeforces-632D Longest Subsequence
- 控件UI性能调优 -- SizeChanged不是万能的
- 酷狗音乐模仿还在继续之UI界面源码下载
- JS高程读书笔记-第一、二章-内附在线思维导图和quizlet卡片
- IOS中UITableViewCell使用详解
- 原生的强大DOM选择器querySelector - querySelector和querySelectorAll
- easyui解析$.parser.parse()的学习,使用地方
- iOS UIStepper 加减计数器
- UIStackView入门示例解析
- UE的注册流程
- easyui checkbox 初始化时设为已选的方法
- java的build
- hdu 5306 Gorgeous Sequence
- 一个无序整数数组中找到最长连续序列(Longest Consecutive Sequence)和两个元素使得相差最小
- UIImagePickerController控件自带按钮显示中文的办法
- pku1947rebuilding roads 树形DP
- cf#VK Cup 2015 - Qualification Round 2-C - Name Quest-贪心