WPF:UIElement以及FrameworkElement中常见事件的运行顺序

测试如下事件和方法:

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值