我的用户控件的构造函数中有一个方法调用,它执行的操作在设计时不起作用(连接到数据库),当我尝试将该控件添加到 GUI 设计器时,Visual Studio 刚刚退出。
当然,我可以将该代码分解为一个单独的方法,但我不喜欢这样的想法,即每次使用该对象时,我都需要记住执行对该对象的功能至关重要的某个方法(这就是构造函数为了!)。
是否有类似预处理器符号的东西,我可以用它来标记我的代码,这样 Visual Studio 就不会在设计时尝试执行该代码?
我的用户控件的构造函数中有一个方法调用,它执行的操作在设计时不起作用(连接到数据库),当我尝试将该控件添加到 GUI 设计器时,Visual Studio 刚刚退出。
当然,我可以将该代码分解为一个单独的方法,但我不喜欢这样的想法,即每次使用该对象时,我都需要记住执行对该对象的功能至关重要的某个方法(这就是构造函数为了!)。
是否有类似预处理器符号的东西,我可以用它来标记我的代码,这样 Visual Studio 就不会在设计时尝试执行该代码?
正如其他人所说,您可以使用该类的DesignMode
属性Component
。但是,您将无法在控件的构造函数中执行此操作。DesignMode
属性总是false
在构造函数和构造函数调用的方法中。要解决此问题,请重构代码以在OnLoad()
回调中连接到数据库。该DesignMode
属性在那时有效。请参阅此处了解原因(查找文章的 DesignMode 部分)。
我刚刚浏览了这篇博客文章,该文章描述了如何使用该System.ComponentModel.LicenseManager.UsageMode
属性来做同样的事情。DesignMode
该博客描述了在处理嵌套控件时该属性的另一个缺点。显然,该UsageMode
属性没有相同的缺点,并且可以在构造函数中使用。我不能亲自担保,但可能值得研究。
在 Windows 窗体中?
if (!DesignMode)
{
// code that shouldn't be executed at design time
}
正如其他人所提到的,这在构造函数中不起作用。它经常在Form.Load
活动中使用。
我喜欢 Michael Petrotta 的 Windows 窗体方法。如果有人想将相同的技术应用于 WPF,只需使用IsInDesignMode
.
例子:
public SomeViewModel()
{
if (!IsInDesignMode)
{
DoWork();
}
}
public SomeViewModel()
{
if (!IsInDesignMode)
{
DoWork();
}
}
如果您正在处理您正在尝试处理的实际 UI,则上面的此代码。如果您在控件上有类似的东西,当您切换回该控件的设计器时,一切正常,并且没有设计时错误。现在,如果您通过从工具箱中将包含上述代码的控件添加到其他表单或其他控件,它将显示一些设计时错误。