【问题标题】:Prevent code from running only in visual studio designer防止代码仅在 Visual Studio 设计器中运行
【发布时间】:2012-08-27 11:40:38
【问题描述】:

我有一个我编写的自定义控件,它在控件的 Load 事件中进行一些位置检查。此位置检查根据其父控件中的设置将控件移动到屏幕上的特定位置。当我编译和运行应用程序时,此代码按预期工作。

但是,当使用 Visual Studio 设计器时,它会导致我的控件被绘制在可视区域之外,并且我无法使用该设计器。是否可以设置一个标志或属性来阻止该 sn-p 代码仅在 Visual Studio 设计器中运行?

我现在唯一的解决方法是注释掉代码,编译,启动设计器,进行更改,然后取消注释代码并重新编译。

【问题讨论】:

    标签: winforms visual-studio-2010


    【解决方案1】:

    你可以检查LicenseManager.UsageMode的值。

    if (LicenseManager.UsageMode == LicenseUsageMode.Runtime)
    {
        // Code here won't run in Visual Studio designer
    }
    

    【讨论】:

    • 这似乎在 Visual Studio 2013 中不起作用......有什么想法吗? (注释掉整个 Load 方法有效)。
    【解决方案2】:

    对于那些建议的解决方案没有奏效的人,我分享以下技巧:

    if (System.Diagnostics.Process.GetCurrentProcess().ProcessName != "devenv")
    {
        // Code that should not be executed at design time
    }
    

    我们正在做的是获取执行代码的进程的名称。如果该进程的名称是“devenv”,那么我们不执行代码。

    在最新版本的 Visual Studio 中,环境在名为“devenv”的进程中运行。

    我确认这在 VS2015 和 VS2017 中有效

    是的,我知道这不是最优雅的解决方案,但它确实有效。是的,我知道这是一个古老的查询,但仍然有一些恐龙——比如我——在这个问题上插手。

    【讨论】:

      【解决方案3】:

      轻微变化,如果设计时间处于活动状态,则退出 Load 方法...

      this.Load += delegate {
          if(LicenseManager.UsageMode == LicenseUsageMode.Designtime) return; //If Design Time -> Exit here 
          // Code here won't run in Visual Studio designer
          // ...
      };
      

      【讨论】:

        猜你喜欢
        • 2014-11-07
        • 1970-01-01
        • 2011-04-12
        • 2012-10-20
        • 2018-04-02
        • 1970-01-01
        • 1970-01-01
        • 2011-02-15
        • 1970-01-01
        相关资源
        最近更新 更多