Rilevazione della modalità di progettazione da un costruttore di Control

A seguito di questa domanda , è ansible rilevare se si è in progettazione o in modalità runtime all’interno del costruttore di un object?

Mi rendo conto che questo potrebbe non essere ansible, e che dovrò cambiare ciò che voglio, ma per ora sono interessato a questa domanda specifica.

È ansible utilizzare l’enumerazione LicenceUsageMode nello spazio System.ComponentModel nomi System.ComponentModel :

 bool designMode = (LicenseManager.UsageMode == LicenseUsageMode.Designtime); 

Stai cercando qualcosa di simile a questo:

 public static bool IsInDesignMode() { if (Application.ExecutablePath.IndexOf("devenv.exe", StringComparison.OrdinalIgnoreCase) > -1) { return true; } return false; } 

Puoi farlo anche controllando il nome del processo:

 if (System.Diagnostics.Process.GetCurrentProcess().ProcessName == "devenv") return true; 

Componente … per quanto ne so non ha la proprietà DesignMode. Questa proprietà è fornita da Control. Ma il problema è quando CustomControl si trova in un modulo nella finestra di progettazione, questo CustomControl è in esecuzione in modalità runtime.

Ho sperimentato che la proprietà DesignMode funziona correttamente solo in Form.

IMPORTANTE

C’è una differenza nell’usare Windows Form o WPF !!

Hanno designer diversi e hanno bisogno di controlli diversi . Inoltre è complicato quando si mischiano i controlli Forms e WPF. (ad esempio, controlli WPF all’interno di una finestra Forms)

Se hai solo Windows Form , usa questo:

 Boolean isInWpfDesignerMode = (LicenseManager.UsageMode == LicenseUsageMode.Designtime); 

Se hai solo WPF , usa questo controllo:

 Boolean isInFormsDesignerMode = (System.Diagnostics.Process.GetCurrentProcess().ProcessName == "devenv"); 

Se hai un uso misto di moduli e WPF, usa un controllo come questo:

 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 } 

Per vedere la modalità corrente puoi mostrare un MessageBox per il debug:

 // show current mode MessageBox.Show(String.Format("DESIGNER CHECK: WPF = {0} Forms = {1}", isInWpfDesignerMode, isInFormsDesignerMode)); 

Osservazioni:

È necessario aggiungere gli spazi dei nomi System.ComponentModel e System.Diagnostics .

È necessario utilizzare la proprietà Component.DesignMode. Per quanto ne so, questo non dovrebbe essere usato da un costruttore.

Un altro metodo interessante è descritto su quel blog: http://www.undermyhat.org/blog/2009/07/in-depth-a-definitive-guide-to-net-user-controls-usage-mode-designmode-or -usermode /

Fondamentalmente, verifica che l’assembly in esecuzione venga referenziato staticamente dal gruppo di voci. Evita la necessità di tenere traccia dei nomi degli assembly (‘devenv.exe’, ‘monodevelop.exe’ ..).

Tuttavia, non funziona in tutti gli altri scenari, in cui l’assembly viene caricato in modo dinamico (VSTO ne è un esempio).

Controlli (Forms, UserControls ecc.) Ereditano la Component class che ha la bool property DesignMode così:

 if(DesignMode) { //If in design mode } 

Con la collaborazione del designer … Può essere utilizzato in Controlli, Componenti, in tutti i luoghi

  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( linee dovrebbero essere rimosse. Mi fa solo essere sicuro che funzioni correttamente.

La soluzione LicenseManager non funziona su OnPaint, nemmeno su questo.DesignMode. Ho fatto ricorso alla stessa soluzione di @Jarek.

Ecco la versione cache:

  private static bool? isDesignMode; private static bool IsDesignMode() { if (isDesignMode == null) isDesignMode = (Process.GetCurrentProcess().ProcessName.ToLower().Contains("devenv")); return isDesignMode.Value; } 

Tenere presente che ciò non funzionerà se si utilizza un IDE di terze parti o se Microsoft (o il proprio utente finale) decide di modificare il nome dell’eseguibile VS in qualcosa di diverso da “devenv”. Il tasso di errore sarà molto basso, ma assicurati di affrontare eventuali errori che potrebbero verificarsi nel codice che non riesce a causa di questo e andrà tutto bene.

Se si desidera eseguire alcune righe quando è in esecuzione ma non nel designer di Visual Studio, è necessario implementare la proprietà DesignMode come segue:

 // 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(); }