使用DesignMode属性与LicenseManager.UsageMode

时间:2009-09-17 22:58:37

标签: c# .net

我见过有关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属性工作正常,我在设计器中打开我的用户控件和表单时遇到了麻烦。

如果我有一个类层次结构,我有时会使该事件处理程序受到虚拟保护,并且我只在子类需要额外初始化时才覆盖它。

我想知道,如果有更好的方法,或者这个模式有什么臭(其他必须多次实现Load事件处理程序?)

1 个答案:

答案 0 :(得分:2)

由于使用嵌套控件(以及相关问题)的DesignMode属性存在问题,我解决此问题的一般方法是甚至不尝试让我的自定义UserControls在设计模式下运行。通常我的控件非常复杂并且是自己绘制的,因此即使DesignMode使用嵌套控件,也需要大量的编程工作才能让它们在设计模式中显示任何有意义的东西(这会减慢开发工作,因为控件需要大量的初始化和设置时间。)

通常我只是添加一个公共Setup()或LoadData()方法来完成所有工作,并且只在运行时调用此方法。在设计模式中,UserControl只显示为正方形,这有助于我定位它而已。

我很有兴趣看看你是否能得到这个问题的任何其他答案,这可能会解决你的问题。