如何在构造函数中使用Visual Studio不会在设计时执行代码?

我在我的用户控件的构造函数中有一个方法调用,它做了一些在设计时无法工作的东西(连接到数据库),而当我尝试将该控件添加到GUI设计器时,Visual Studio就得到了保护。
当然,我可以将代码分解为一个单独的方法,但我不喜欢每次使用该对象时我都需要记住执行某个对象函数必不可少的方法的想法(这就是构造函数是什么对于!)。

是否有类似预处理器符号的东西,我可以用我的代码标记,以便Visual Studio不会尝试在设计时执行该代码?

正如其他人所说,您可以使用Component类的DesignMode属性。 但是,您将无法在控件的构造函数中执行此操作。 在构造函数调用的构造函数和方法中, 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事件。

看看这个

Component.DesignMode属性

我喜欢Michael Petrotta的Windows Forms方法。 如果有人想将相同的技术应用于WPF,只需使用IsInDesignMode

例:

 public SomeViewModel() { if (!IsInDesignMode) { DoWork(); } } 
 public SomeViewModel() { if (!IsInDesignMode) { DoWork(); } } 

如果您正在处理您尝试使用的实际UI,请使用上面的代码。 如果你在控件上有类似的东西,当你切换回该控件的设计器时,它没问题,没有设计时错误。 现在,如果您通过从工具箱中拖动包含上述代码的控件将其添加到某个其他窗体或其他控件,则会显示一些设计时错误。