我见过有关Forms和UserControls的DesignMode属性的多篇帖子和问题.我们的想法是您要检查控件是否处于设计模式(例如,控件显示在Visual Studio Designer中),并避免只能在运行时运行的代码.我见过很多人遇到的问题 - 最近我的失败记忆也暴露了我 - 是DesignMode属性在构造函数中不起作用,并且不适用于嵌套控件.但是,它在您的控件或窗体的Load事件处理程序中运行得非常好!!
当你考虑它时,Forms或UserControls的构造函数中的代码应该只处理不需要加载表单的状态.处理UI对象初始化的代码应该位于控件的Load事件处理程序中.在该函数中,DesignMode属性可以工作.Designer会在当时使用其正确的值.
原则上,已调用InitializeComponent()方法,但实际上,当您在"设计"视图中显示控件时,Designer仅解析该函数,但它不会运行它.但是,Designer会运行嵌套控件的构造函数.如果您绝对需要在构造函数中放置初始化代码,请使用System.ComponentModel.LicenseManager类,它有一个名为UsageMode的静态属性,它接受DesignTime或RunTime的值.您可以完全信任控件的构造函数中的属性 - 但仅在构造函数中!
我忘记了我正在处理的应用程序中的一点点微妙之处.为了解决这个问题,我现在坚持所有需要额外初始化的控件和表单都必须为Load事件实现处理程序的模式.在那里,DesignMode属性工作正常,我在Designer中打开用户控件和表单时遇到了麻烦.
如果我有一个类层次结构,我有时会使该事件处理程序受到虚拟保护,并且我只在子类需要额外初始化时才覆盖它.
我想知道,如果有更好的方法,或者这个模式有什么臭(其他必须多次实现一个Load事件处理程序?)
由于将 DesignMode 属性与嵌套控件一起使用时存在问题(以及相关问题),因此我解决此问题的一般方法是什至不尝试让自定义 UserControls 在设计模式下运行。通常我的控件非常复杂并且是所有者绘制的,因此即使设计模式与嵌套控件一起使用,也需要大量的编程工作才能让它们在设计模式中显示任何有意义的内容(并且这会减慢开发工作,因为控件需要大量的初始化和设置时间)。
通常我只是添加一个公共的 Setup() 或 LoadData() 方法来完成所有工作,并且仅在运行时调用此方法。那么,在设计模式下,UserControl 仅显示为正方形,这有助于我定位它,仅此而已。
我很想看看您是否能得到这个问题的任何其他答案,但这可能会解决您的问题。