WinForms:UserControl DesignTime:使用哪种方法?

WinForms: UserControl DesignTime: which method to use?

我在 Whosebug 上找到了这个答案:DesignMode with NestedControls

最佳答案指出,如果您不想使用反射,并且想在构造函数中检查您是否处于设计模式,您应该使用类似的东西:

bool inDesignMode = System.ComponentModel.LicenseManager.UsageMode == LicenseUsageMode.Designtime;

我的问题

为了对此进行测试,我创建了一个带有三个标签的简单用户控件:

public MyUserControl()
{
    InitializeComponent();

    this.label1.Text = String.Format("Construction: DesignMode: {0}", this.DesignMode);

    bool inDesignMode = System.ComponentModel.LicenseManager.UsageMode == LicenseUsageMode.Designtime;
    this.label2.Text = String.Format("Construction: LicenseManager: {0}", inDesignMode);
}

private void Onload(object sender, EventArgs e)
{
    this.label3.Text = String.Format("OnLoadDesignMode: {0}", this.DesignMode);
}

我还创建了一个带有此 Usercontrol 的表单。 如果我使用设计器来显示表单,我会看到以下内容:

Conclusion: in the constructor you can't use DesignMode. However,you can use the LicenseManager

但是,如果我在设计器中打开用户控件,似乎甚至没有使用构造函数!

所以我现在有点迷茫。

However, if I open the usercontrol in the designer, it seems like the constructor isn't even used! So now I am a bit confused.

设计器没有调用您正在设计的根组件的构造函数。相反,它调用根组件的基础 class 的构造函数,然后解析设计器生成的根组件代码,创建子组件并设置属性并将它们添加到根并加载设计器。

现在应该清楚这里发生了什么:

  • 当你在设计MyUserControl:UserControl的时候,会调用UserControl的构造函数。 (MyUserControl 的构造函数在这里没用。)

  • 当你在设计Form1: Form时,它上面有一个MyUserControl的实例,Form的构造函数将被调用,Form1.Designer.cs将是已解析并且由于存在 MyUserControl 的实例,MyUserControl 的构造函数将 运行 和控件的实例将添加到设计图面。

您可以在 or 中找到一个有趣的示例,它展示了设计器如何解析和加载表单(设计器代码中存在一些严重的语法问题)。