Ho visto più post e domande sulla proprietà DesignMode di Forms e UserControls. L'idea è di voler controllare se il controllo è in modalità progettazione (ad esempio il controllo è mostrato in Visual Studio Designer) ed evitare il codice che può essere eseguito solo, beh, in fase di esecuzione. Il problema che ho visto molti - e anche la mia memoria fallita mi ha esposto anche a me, di recente - è che la proprietà DesignMode non funziona nel costruttore e non funziona per i controlli annidati. Tuttavia, funziona molto bene nel Load Event Handler per il controllo o il modulo !!Utilizzo della proprietà DesignMode rispetto a LicenseManager.UsageMode
Quando ci si pensa, il codice nei costruttori di Forms o UserControls deve trattare solo lo stato che non richiede il caricamento del modulo. Il codice che gestisce l'inizializzazione degli oggetti UI dovrebbe trovarsi nel gestore eventi Load per il controllo. E in quella funzione, la proprietà DesignMode funziona. Il Designer utilizzerà il suo valore corretto in quel momento.
In linea di principio, è stato chiamato il metodo InitializeComponent(), ma in realtà, quando si visualizza il controllo in visualizzazione Struttura, Designer solo analizza tale funzione, ma non la esegue. Il Designer, tuttavia, esegue il costruttore di controlli annidati. Se è assolutamente necessario inserire il codice di inizializzazione nel costruttore, utilizzare la classe System.ComponentModel.LicenseManager, ha una proprietà statica denominata UsageMode che accetta valori di DesignTime o RunTime. Puoi assolutamente fidarti di quella proprietà nel costruttore del tuo controllo - ma solo nel costruttore!
Avevo dimenticato quella piccola sottigliezza nell'app a cui sto lavorando al momento. Per aggirare il problema, sto aderendo ora allo schema che tutti i controlli e le forme che necessitano di un'inizializzazione aggiuntiva devono implementare un gestore per l'evento Load. In questo caso, la proprietà DesignMode funziona correttamente e non ho mai avuto problemi nell'apertura del mio controllo utente e dei moduli nel Designer.
Se si dispone di una gerarchia di classi, a volte faccio in modo che quel gestore di eventi sia protetto virtualmente e lo sovrascrivo solo quando la sottoclasse necessita di un'inizializzazione aggiuntiva.
Mi chiedo, però, se ci sono metodi migliori là fuori, o se c'è qualcosa di puzzolente su questo modello (altro che dover implementare un gestore di eventi Load molte volte?)
Molto utile, grazie. –