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