WPF控件从创建到显示

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;

public class TextBoxTime : TextBox
{
    public TextBoxTime()
    {
        //恰好在呈现组合树中的对象之前发生。
        CompositionTarget.Rendering += UpdateRender;
        Loaded += TB_Loaded;
    }

    public override void BeginInit()
    {
        //启动此元素的初始化过程。
        base.BeginInit();
    }

    public override void EndInit()
    {
        //指示该元素的初始化过程已完成。
        base.EndInit();
    }

    /// <summary>
    /// 这事件会一直触发,根据屏幕刷新率刷新
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void UpdateRender(object sender, EventArgs e)
    {
        this.Text = DateTime.Now.ToString();
    }

    /// <summary>
    /// 在应用控件模板时调用。
    /// </summary>
    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
    }

    /// <summary>
    /// 调整大小的文本设置为其内容。
    /// </summary>
    /// <param name="availableSize"></param>
    /// <returns></returns>
    protected override Size MeasureOverride(Size availableSize)
    {
        return base.MeasureOverride(availableSize);
    }

    /// <summary>
    /// 调用以排列和调整大小的内容 System.Windows.Controls.Control 对象。
    /// </summary>
    /// <param name="arrangeBounds"></param>
    /// <returns></returns>
    protected override Size ArrangeOverride(Size arrangeBounds)
    {
        return base.ArrangeOverride(arrangeBounds);
    }

    /// <summary>
    /// 在派生类中重写时,会参与由布局系统控制的呈现操作。 不直接调用此方法时,使用此元素的呈现指令,而是保留供以后异步使用布局和绘制。
    /// 只是在影响布局是发生,就改变了长宽时
    /// </summary>
    /// <param name="drawingContext"></param>
    protected override void OnRender(DrawingContext drawingContext)
    {
        //在这里ActualWidth和ActualHeight就已经有值了
        base.OnRender(drawingContext);
        this.Text = DateTime.Now.ToString();
    }

    private void TB_Loaded(object sender, RoutedEventArgs e)
    {
    }

}

一个控件从实例化到显示出来中间经过上述的这些事件,但是事件的触发是有先后顺序的,通过测试后发现顺序如下:

BeginInit启动此元素的初始化过程。
EndInit指示该元素的初始化过程已完成。
UpdateRender

恰好在呈现组合树中的对象之前发生。

这事件会一直触发,根据屏幕刷新率刷新

OnApplyTemplate在应用控件模板时调用。
MeasureOverride调整大小的文本设置为其内容。
ArrangeOverride调用以排列和调整大小的内容Control 对象。
OnRender在派生类中重写时,会参与由布局系统控制的呈现操作。 不直接调用此方法时,使用此元素的呈现指令,而是保留供以后异步使用布局和绘制。(只是在影响布局是发生,就改变了长宽时)
Loaded当对元素进行布局、呈现,且可将其用于交互时发生。

posted @ 2022-04-12 22:45  Bridgebug  阅读(105)  评论(0编辑  收藏  举报