从Control的构造函数中检测devise模式
继续这个问题 ,是否有可能从一个对象的构造函数中检测是否处于devise或运行时模式?
我意识到这可能是不可能的,我将不得不改变我想要的,但现在我对这个具体的问题感兴趣。
您可以在System.ComponentModel
命名空间中使用LicenceUsageMode枚举:
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;
组件…据我所知没有DesignMode属性。 该属性由Control提供。 但问题是当CustomControl位于devise器中的Form中时,此CustomControl以运行时模式运行。
我曾经体验过,DesignMode属性只能在Form中正确工作。
您应该使用Component.DesignMode属性。 据我所知,这不应该从一个构造函数中使用。
重要
有使用Windows 窗体或WPF的区别!
他们有不同的devise师,需要不同的检查 。 另外,当你将表单和WPF控件混合在一起时,这是非常棘手的。 (例如,一个窗体内的WPF控件)
如果只有Windows 窗体 ,请使用以下命令:
Boolean isInWpfDesignerMode = (LicenseManager.UsageMode == LicenseUsageMode.Designtime);
如果你只有WPF ,使用这个检查:
Boolean isInFormsDesignerMode = (System.Diagnostics.Process.GetCurrentProcess().ProcessName == "devenv");
如果你有表单和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 }
要查看当前模式,可以显示一个用于debugging的MessageBox:
// show current mode MessageBox.Show(String.Format("DESIGNER CHECK: WPF = {0} Forms = {1}", isInWpfDesignerMode, isInFormsDesignerMode));
备注:
您需要添加名称空间System.ComponentModel和System.Diagnostics 。
另一个有趣的方法在该博客中描述: http : //www.undermyhat.org/blog/2009/07/in-depth-a-definitive-guide-to-net-user-controls-usage-mode-designmode-or -usermode /
基本上,它testing执行程序集从入口程序集静态引用。 它规避了跟踪程序集名称('devenv.exe','monodevelop.exe')的需要。
但是,在dynamic加载程序集的所有其他情况下(VSTO只是一个示例),它不起作用。
控件(窗体,用户控件等)inheritanceComponent class
,它具有bool property DesignMode
所以:
if(DesignMode) { //If in design mode }
与devise师的合作…它可以在控制器,组件,所有地方使用
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(
行应该被删除,它只是让我确定它工作正常。
LicenseManager解决scheme在OnPaint中不起作用,this.DesignMode也不起作用。 我使用了与@Jarek相同的解决scheme。
这是caching版本:
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”以外的内容,将会失败。 失败率将非常低,只要确保您处理由于这种情况而失败的代码中可能发生的任何由此产生的错误,那么您将会很好。