WinForm加载时各事件的顺序

WinForm加载时各事件的顺序

    public partial class TestForm : Form
    {
        public TestForm()
        {
            Console.WriteLine(1);
            InitializeComponent();
            Console.WriteLine(2);
        }
        protected override void OnLoad(EventArgs e)
        {
            Console.WriteLine(3);
            base.OnLoad(e);
            Console.WriteLine(4);
        }
        protected override void OnCreateControl()
        {
            Console.WriteLine(5);
            base.OnCreateControl();
            Console.WriteLine(6);
        }
        protected override void OnShown(EventArgs e)
        {
            Console.WriteLine(7);
            base.OnShown(e);
            Console.WriteLine(8);
        }
        protected override void OnActivated(EventArgs e)
        {
            Console.WriteLine(9);
            base.OnActivated(e);
            Console.WriteLine(10);
        }
        protected override void OnClientSizeChanged(EventArgs e)
        {
            Console.WriteLine(11);
            base.OnClientSizeChanged(e);
            Console.WriteLine(12);
        }
        protected override void OnGotFocus(EventArgs e)
        {
            Console.WriteLine(13);
            base.OnGotFocus(e);
            Console.WriteLine(14);
        }
        protected override void OnResize(EventArgs e)
        {
            Console.WriteLine(15);
            base.OnResize(e);
            Console.WriteLine(16);
        }
    }

先注意:public partial class TestForm : Form 

1.先执行TestForm()  ;

2.protected override void OnCreateControl() 

3.接下来这都是根据调用顺序执行的

 

OnCreateControl() 

OnGotFocus(EventArgs e)  

 OnActivated(EventArgs e)  

 OnShown(EventArgs e)  

 

1  2  5  3  4 6  13  14  9  10  7  8

 

p.s.

C# 自定义控件的事件顺序

   实际正确的顺序:    |   UerControl.InitialComponent –>     |

                        |   UerControl.构造方法 –>             |

                        |   引用窗体.InitialComponent –>       |

                        |   引用窗体.构造方法 –>               |

                        |   UerControl.Load –>                 |

                        |   引用窗体.Load                       |

 

 

对于一个窗体程序,第一步,我们都知道,一定是执行Form()构造函数,初始化窗体,控件等内容,待内容初始完备后,将窗体Show()出来。

        这里需要注意的是,我们可以用Show()和ShowDialog()两个方法可以用,通常情况下,我们一般都用Show()这个方法。其实要用哪一个方法,还是需要结合我们具体的需求,而Show()与ShowDialog()的主要区别在于,后一个展示的窗体是独占的,如果打开了对应的窗体,不将其关掉,它便会独占主线程,使得不能在对系统的其他功能做操作,而前一个便不会有这样的影响。

       或许这时有人会以为 Show()方法执行之后,接下来应该是执行Shown()方法。这里注意了,在Show()方法之后,主线程是会继续执行Load()事件,通常我们对窗体的初始化赋值,一般都是写在这个事件里面,但是也有人会写在构造函数里。不过个人建议一下,对应一些控件层级的操作(给一个控件添加一个默认控件)等操作,可以写在构造函数里,其他的变量赋值等之类的操作,尽量都写在Load()事件里吧。

        Load()事件完成后,接下来便是执行Shown()方法,不过在窗体程序的编写中,很少用到这一个方法,可做一个了解,说不定哪天遇到某个需求,就需要用到这个方法才能有效的解决。值得注意的是,SizeChange()事件与它基本是属于同级的。所以出发Shown()与触发SizeChange()事件都是在Load()事件之后。

        而在窗体加载至完成,还有一个非常重要的一个事件,Activated()事件,他是在窗体激活时或产生操作(包括鼠标点击)时发生。在窗体主线程执行完成会触发此事件,所以,在这里面的操作,是不会对窗体的加载造成影响的,所以加快窗体的加载速度,可以在这个事件上面动文章。不过如果想不到这个的事件,想要不影响窗体加载,提高窗体加载速度,可以利用线程等来实现。其原理都是让主线程快速执行完成,这样窗体就不会停留在假死的状态呢。
 

 

 

 

hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » WinForm加载时各事件的顺序