Answers:
您可以在名称空间中使用LicenceUsageMode枚举System.ComponentModel
:
bool designMode = (LicenseManager.UsageMode == LicenseUsageMode.Designtime);
您是否正在寻找这样的东西:
public static bool IsInDesignMode()
{
if (Application.ExecutablePath.IndexOf("devenv.exe", StringComparison.OrdinalIgnoreCase) > -1)
{
return true;
}
return false;
}
您也可以通过检查进程名称来做到这一点:
if (System.Diagnostics.Process.GetCurrentProcess().ProcessName == "devenv")
return true;
devenv
。
组件...据我所知没有DesignMode属性。此属性由Control提供。但是问题是,当CustomControl位于设计器的窗体中时,该CustomControl在运行时模式下运行。
我已经体验到DesignMode属性仅在Form中有效。
重要
使用Windows 窗体或WPF有区别!
他们有不同的设计师,需要不同的检查。另外,当您混合使用Forms和WPF控件时,这很棘手。(例如,“窗体”窗口内的WPF控件)
如果只有Windows 窗体,请使用以下命令:
Boolean isInWpfDesignerMode = (LicenseManager.UsageMode == LicenseUsageMode.Designtime);
如果只有WPF,请使用此检查:
Boolean isInFormsDesignerMode = (System.Diagnostics.Process.GetCurrentProcess().ProcessName == "devenv");
如果您混合使用 Forms和WPF,请使用如下检查:
Boolean isInWpfDesignerMode = (LicenseManager.UsageMode == LicenseUsageMode.Designtime);
Boolean isInFormsDesignerMode = (System.Diagnostics.Process.GetCurrentProcess().ProcessName == "devenv");
if (isInWpfDesignerMode || isInFormsDesignerMode)
{
// is in any designer mode
}
else
{
// not in designer mode
}
要查看当前模式,可以显示一个MessageBox进行调试:
// show current mode
MessageBox.Show(String.Format("DESIGNER CHECK: WPF = {0} Forms = {1}", isInWpfDesignerMode, isInFormsDesignerMode));
备注:
您需要添加名称空间System.ComponentModel和System.Diagnostics。
您应该使用Component.DesignMode属性。据我所知,不应从构造函数中使用它。
if (!DesignMode)
OnPaint方法以确保它不会浪费设计时间。
该博客上介绍了另一种有趣的方法:http://www.undermyhat.org/blog/2009/07/in-depth-a-definitive-guide-to-net-user-controls-usage-mode-designmode-or -用户模式/
基本上,它测试从入口程序集中静态引用的执行程序集。它避免了跟踪程序集名称(“ devenv.exe”,“ monodevelop.exe” ..)的需要。
但是,它不适用于动态加载程序集的所有其他方案(VSTO是一个示例)。
在设计人员的协助下...可以在所有地方的控件,组件中使用
private bool getDesignMode()
{
IDesignerHost host;
if (Site != null)
{
host = Site.GetService(typeof(IDesignerHost)) as IDesignerHost;
if (host != null)
{
if (host.RootComponent.Site.DesignMode) MessageBox.Show("Design Mode");
else MessageBox.Show("Runtime Mode");
return host.RootComponent.Site.DesignMode;
}
}
MessageBox.Show("Runtime Mode");
return false;
}
MessageBox.Show(
线应删除。这只是让我确定它可以正常工作。
你可以用这个
if (DesignerProperties.GetIsInDesignMode(this))
{
...
}
这是我在项目中使用的方法:
//use a Property or Field for keeping the info to avoid runtime computation
public static bool NotInDesignMode { get; } = IsNotInDesignMode();
private static bool IsNotInDesignMode()
{
/*
File.WriteAllLines(@"D:\1.log", new[]
{
LicenseManager.UsageMode.ToString(), //not always reliable, e.g. WPF app in Blend this will return RunTime
Process.GetCurrentProcess().ProcessName, //filename without extension
Process.GetCurrentProcess().MainModule.FileName, //full path
Process.GetCurrentProcess().MainModule.ModuleName, //filename
Assembly.GetEntryAssembly()?.Location, //null for WinForms app in VS IDE
Assembly.GetEntryAssembly()?.ToString(), //null for WinForms app in VS IDE
Assembly.GetExecutingAssembly().Location, //always return your project's output assembly info
Assembly.GetExecutingAssembly().ToString(), //always return your project's output assembly info
});
//*/
//LicenseManager.UsageMode will return RunTime if LicenseManager.context is not present.
//So you can not return true by judging it's value is RunTime.
if (LicenseUsageMode.Designtime == LicenseManager.UsageMode) return false;
var procName = Process.GetCurrentProcess().ProcessName.ToLower();
return "devenv" != procName //WinForms app in VS IDE
&& "xdesproc" != procName //WPF app in VS IDE/Blend
&& "blend" != procName //WinForms app in Blend
//other IDE's process name if you detected by log from above
;
}
注意!!!:代码返回布尔表示是不以设计模式!
private void CtrlSearcher_Load(object sender, EventArgs e)
{
if(!this.DesignMode) InitCombos();
}
LicenseManager解决方案在OnPaint内不起作用,this.DesignMode也不起作用。我求助于与@Jarek相同的解决方案。
这是缓存的版本:
private static bool? isDesignMode;
private static bool IsDesignMode()
{
if (isDesignMode == null)
isDesignMode = (Process.GetCurrentProcess().ProcessName.ToLower().Contains("devenv"));
return isDesignMode.Value;
}
请注意,如果您使用任何第三方IDE,或者Microsoft(或您的最终用户)决定将VS可执行文件的名称更改为'devenv'以外的名称,则此操作将失败。故障率将非常低,只需确保您处理可能导致代码失败的任何结果错误,就可以了。
如果要在运行时运行某些行而不是在Visual Studio设计器中运行,则应实现DesignMode属性,如下所示:
// this code is in the Load of my UserControl
if (this.DesignMode == false)
{
// This will only run in run time, not in the designer.
this.getUserTypes();
this.getWarehouses();
this.getCompanies();
}
使用自定义/用户控件时,默认情况下启用的计时器可能会导致崩溃。默认情况下禁用它们,仅在设计模式检查后启用
public chartAdapter()
{
try
{
//Initialize components come here
InitializeComponent();
//Design mode check
bool designMode = (LicenseManager.UsageMode == LicenseUsageMode.Designtime);
if (designMode)
return;
//Enable timers ONLY after designmode check, or else crash
timerAutoConnect.Enabled = timerDraw.Enabled = true;
ISite.DesignMode
。