回答:
名前空間で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の使用には違いがあります!!
彼らは異なるデザイナーがいて、異なるチェックが必要です。さらに、フォームコントロールと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
}
現在のモードを確認するには、デバッグ用のメッセージボックスを表示します。
// 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 -usermode /
基本的には、エントリアセンブリから静的に参照されている実行中のアセンブリをテストします。アセンブリ名( 'devenv.exe'、 'monodevelop.exe' ..)を追跡する必要性を回避します。
ただし、アセンブリが動的に読み込まれる他のすべてのシナリオでは機能しません(VSTOが1つの例です)。
設計者の協力を得て...コントロール、コンポーネント、あらゆる場所で使用できます
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
。