2009-09-17 13 views
5

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?)

+0

Molto utile, grazie. –

risposta

2

A causa dei problemi con utilizzando la proprietà DesignMode con controlli nidificati (e problemi correlati), il mio approccio generale a questo problema è di non provare nemmeno a far funzionare i miei UserControls personalizzati in modalità progettazione. Di solito i miei controlli sono molto complicati e disegnati dal proprietario, quindi anche se il DesignMode lavorava con i controlli annidati, sarebbe necessario un notevole sforzo di programmazione per far sì che mostrassero qualcosa di significativo in modalità progettazione (e rallenterebbe il lavoro di sviluppo, perché i controlli richiedono una quantità significativa di inizializzazione e tempo di installazione).

Di solito aggiungo solo un metodo pubblico Setup() o LoadData() che esegue tutto il lavoro, e richiama questo metodo solo in fase di esecuzione. In modalità progettazione, quindi, UserControl si presenta come un quadrato, il che mi aiuta a posizionarlo e niente più.

Sono interessato a vedere se si ottiene qualsiasi altra risposta a questa domanda, tuttavia, che potrebbe risolvere i vostri problemi.

+0

È una vera comodità essere in grado di controllare il controllo in visualizzazione struttura, soprattutto se si desidera eseguire la sottoclassifica. Se non lo fai, almeno una cornice per il layout del controllo in una forma va bene (come stai facendo). Se il controllo utilizza un sacco di standard ed è necessario armeggiare con le posizioni, le proprietà o con i gestori di eventi dei componenti del controllo, allora una vista Progettazione dall'aspetto realistico diventa importante. Inoltre, penso che sia gratificante sapere che il mio controllo può essere usato da qualcuno che potrebbe non avere il codice per farlo :). –

+0

@Sam: Sono totalmente d'accordo con tutto ciò che dici, ea volte mi coinvolge nel tentativo di far funzionare i miei controlli in modalità progettazione. Non appena mi imbatto in seri problemi, però, di solito esco, anche se a volte non abbastanza presto. – MusiGenesis

Problemi correlati