代码之家  ›  专栏  ›  技术社区  ›  polyglot

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

  •  16
  • polyglot  · 技术社区  · 15 年前

    我在用户控件的构造函数中有一个方法调用,它在设计时(连接到数据库)执行了一些不工作的操作,而当我试图将该控件添加到GUI设计器时,Visual Studio刚刚退出。
    当然,我可以将代码分解成一个单独的方法,但我不喜欢这样的想法,即每次使用该对象时,我都需要记住执行某个对该对象的函数至关重要的方法(这就是构造函数的作用!).

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

    5 回复  |  直到 8 年前
        1
  •  26
  •   Matt Davis    15 年前

    正如其他人所说,您可以使用 DesignMode 的属性 Component 类。但是,您将无法在控件的构造函数中执行此操作。这个 设计模式 属性总是 false 在构造函数和构造函数调用的方法中。要解决此问题,请重新考虑代码以连接到 OnLoad() 回调。这个 设计模式 此时属性有效。见 here 对于推理(请查看本文的设计模式部分)。

    我刚刚遇到这个 blog entry 它描述了如何使用 System.ComponentModel.LicenseManager.UsageMode 属性来执行相同的操作。博客描述了 设计模式 处理嵌套控件时的属性。显然, UsageMode 属性没有相同的缺点,可以在构造函数中使用。我不能亲自担保,但可能值得调查。

        2
  •  14
  •   Michael Petrotta user3140870    15 年前

    在Windows窗体中?

    if (!DesignMode)
    {
        // code that shouldn't be executed at design time
    }
    

    正如其他人提到的,这在构造函数中不起作用。它经常用于 Form.Load 事件。

        3
  •  1
  •   Adriaan Stander    15 年前
        4
  •  0
  •   B.K.    10 年前

    我喜欢Michael Petrotta的Windows窗体方法。如果有人想对WPF应用相同的技术,只需使用 IsInDesignMode .

    例子:

    public SomeViewModel()
    {
        if (!IsInDesignMode)
        {
            DoWork();
        }
    }
    
        5
  •  0
  •   DanielBarbarian kdgilang    8 年前
    public SomeViewModel()
    {
        if (!IsInDesignMode)
        {
            DoWork();
        }
    }
    

    如果您正在处理的是实际的UI,那么上面的代码。在这样的情况下,当您切换回该控件的设计器时,它是正常的,没有设计时错误。现在,如果通过从工具箱中将包含上述代码的控件拖动到其他窗体或其他控件中,它将显示一些设计时错误。