我有一个我编写的自定义控件,它在控件的 Load 事件中进行一些位置检查。此位置检查根据其父控件中的设置将控件移动到屏幕上的特定位置。当我编译和运行应用程序时,此代码按预期工作。
但是,当使用 Visual Studio 设计器时,它会导致我的控件被绘制在可视区域之外,并且我无法使用该设计器。是否可以设置一个标志或属性来阻止该代码片段仅在 Visual Studio 设计器中运行?
我现在唯一的解决方法是注释掉代码,编译,启动设计器,进行更改,然后取消注释代码并重新编译。
我有一个我编写的自定义控件,它在控件的 Load 事件中进行一些位置检查。此位置检查根据其父控件中的设置将控件移动到屏幕上的特定位置。当我编译和运行应用程序时,此代码按预期工作。
但是,当使用 Visual Studio 设计器时,它会导致我的控件被绘制在可视区域之外,并且我无法使用该设计器。是否可以设置一个标志或属性来阻止该代码片段仅在 Visual Studio 设计器中运行?
我现在唯一的解决方法是注释掉代码,编译,启动设计器,进行更改,然后取消注释代码并重新编译。
您可以检查 的值LicenseManager.UsageMode
。
if (LicenseManager.UsageMode == LicenseUsageMode.Runtime)
{
// Code here won't run in Visual Studio designer
}
对于那些建议的解决方案没有奏效的人,我分享以下技巧:
if (System.Diagnostics.Process.GetCurrentProcess().ProcessName != "devenv")
{
// Code that should not be executed at design time
}
我们正在做的是获取执行代码的进程的名称。如果该进程的名称是“devenv”,那么我们不执行代码。
在最新版本的 Visual Studio 中,环境在名为“devenv”的进程中运行。
我确认这适用于 VS2015 和 VS2017
是的,我知道这不是最优雅的解决方案,但它确实有效。是的,我知道这是一个古老的问题,但仍然有一些恐龙——比如我——在这个问题上插手。
轻微变化,如果设计时间处于活动状态,则退出 Load 方法...
this.Load += delegate {
if(LicenseManager.UsageMode == LicenseUsageMode.Designtime) return; //If Design Time -> Exit here
// Code here won't run in Visual Studio designer
// ...
};