重新审视这个问题,我现在“发现”了 5 种不同的方法,如下所示:
System.ComponentModel.DesignMode property
System.ComponentModel.LicenseManager.UsageMode property
private string ServiceString()
{
if (GetService(typeof(System.ComponentModel.Design.IDesignerHost)) != null)
return "Present";
else
return "Not present";
}
public bool IsDesignerHosted
{
get
{
Control ctrl = this;
while(ctrl != null)
{
if((ctrl.Site != null) && ctrl.Site.DesignMode)
return true;
ctrl = ctrl.Parent;
}
return false;
}
}
public static bool IsInDesignMode()
{
return System.Reflection.Assembly.GetExecutingAssembly()
.Location.Contains("VisualStudio"))
}
为了尝试掌握提出的三个解决方案,我创建了一个小测试解决方案 - 包含三个项目:
- TestApp(winforms 应用程序),
- 子控件 (dll)
- 子子控件 (dll)
然后我将 SubSubControl 嵌入到 SubControl 中,然后将每个嵌入到 TestApp.Form 中。
此屏幕截图显示了运行时的结果。
此屏幕截图显示了在 Visual Studio 中打开表单的结果:
结论:似乎没有反射,在构造函数中唯一可靠的是 LicenseUsage,而在构造函数之外唯一可靠的是“IsDesignedHosted”(由下面的BlueRaja 提供)
PS:请参阅下面 ToolmakerSteve 的评论(我尚未测试):“请注意,IsDesignerHosted答案已更新为包含 LicenseUsage ...,因此现在测试可以简单地是 if (IsDesignerHosted)。另一种方法是在构造函数中测试LicenseManager并缓存结果。”