前阵子测试DesignMode的时候,发现结果总是与预期不一致。好久都没搞明白。
最近,偶然想到一件事。猜想可能与此有关。因此测试了一下。测试结果记录如下:
测试1:在从设计器打开窗体时,是否执行构造函数,分别对当前类构造函数与基类构造函数进行测试。
测试过程:
添加两个窗体FrmDisignModeTestBase和FrmDisignModeTest,其中FrmDisignModeTest继承自FrmDisignModeTestBase。在其构造函数中分别写入一些测试代码:
public FrmDesignModeTestBase()
{
InitializeComponent();
label1.Text = "base Constructor has been executed";
}
public FrmDisignModeTest()
{
InitializeComponent();
label2.Text = "Constructor has been executed";
}
编译程序,再从设计器打开FrmDisignModeTest,可以看到FrmDisignModeTest的构造函数未执行,但FrmDisignModeTestBase被执行。
测试结果:在设计器中打开窗体时,窗体基类构造函数将被执行,当前类构造函数不会被执行。
在测试过程中,同时发现一个现象:修改基类构造函数,不生成程序,就打开派生窗体时,可以看到执行的基类构造函数是未修改之前的代码;重新生成后再打开,执行的基类构造函数是修改的后代码。经过验证,结果确实如此。
由此,可以推断:在IDE中打开窗体时,将从基类所在程序集加载控件并执行其构造函数。
注:无论是否先编译程序,打开窗体时,窗体的当前构造函数始终不会被执行。
注:对于复合控件,添加到IDE中时,其内部子控件的DesignMode会失效。若一个控件被继承,在IDE中使用派生类控件时,基类的DesignMode不会失效。