博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WPF:UIElement以及FrameworkElement中的OnRender,LayoutUpdated事件的运行顺序
阅读量:4091 次
发布时间:2019-05-25

本文共 2271 字,大约阅读时间需要 7 分钟。

测试如下事件和方法:

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事件发生代表所有预处理项已完成。

转载地址:http://iviii.baihongyu.com/

你可能感兴趣的文章
Spring AOP + Redis + 注解实现redis 分布式锁
查看>>
poj 1976 A Mini Locomotive (dp 二维01背包)
查看>>
《计算机网络》第五章 运输层 ——TCP和UDP 可靠传输原理 TCP流量控制 拥塞控制 连接管理
查看>>
《PostgreSQL技术内幕:查询优化深度探索》养成记
查看>>
剑指_复杂链表的复制
查看>>
FTP 常见问题
查看>>
shell 快捷键
查看>>
MODULE_DEVICE_TABLE的理解
查看>>
No devices detected. Fatal server error: no screens found
查看>>
db db2_monitorTool IBM Rational Performace Tester
查看>>
postgresql监控工具pgstatspack的安装及使用
查看>>
swift中单例的创建及销毁
查看>>
【JAVA数据结构】双向链表
查看>>
【JAVA数据结构】先进先出队列
查看>>
谈谈加密和混淆吧[转]
查看>>
乘法逆元
查看>>
Objective-C 基础入门(一)
查看>>
phpquery抓取网站内容简单介绍
查看>>
找工作准备的方向(4月22日写的)
查看>>
关于fwrite写入文件后打开查看是乱码的问题
查看>>