답변:
네임 스페이스 에서 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이 디자이너의 Form에있을 때이 CustomControl이 런타임 모드에서 실행된다는 것입니다.
DesignMode 속성이 Form에서만 올바르게 작동한다는 것을 경험했습니다.
중대한
Windows Forms 또는 WPF 사용에는 차이가 있습니다 !!
그들은 다른 디자이너를 가지고 있고 다른 수표 가 필요 합니다 . 또한 Forms와 WPF 컨트롤을 혼합하면 까다 롭습니다. (예 : Forms 창 내부의 WPF 컨트롤)
Windows Forms 만 있는 경우 다음을 사용하십시오.
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 -usermode /
기본적으로 항목 어셈블리에서 정적으로 참조되는 실행 어셈블리를 테스트합니다. 어셈블리 이름 ( 'devenv.exe', 'monodevelop.exe'..)을 추적 할 필요가 없습니다.
그러나 어셈블리가 동적으로로드되는 다른 모든 시나리오에서는 작동하지 않습니다 (VSTO가 한 예임).
디자이너의 협력으로 ... 모든 곳에서 Controls, Components에서 사용 가능
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
;
}
주의 !!! : 반환 된 bool 코드 는 디자인 모드가 아님 을 나타냅니다 !
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
.