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 中找到一个有趣的示例,它展示了设计器如何解析和加载表单(设计器代码中存在一些严重的语法问题)。
我在 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
的构造函数将 运行 和控件的实例将添加到设计图面。
您可以在