2010-03-08 10 views
5

Pre .net Stavo usando MFC, ON_UPDATE_COMMAND_UI e la classe CCmdUI per aggiornare lo stato dell'interfaccia utente di Windows. dal precedente riferimento MFC/Win32:Aggiornamento degli oggetti dell'interfaccia utente nei moduli di Windows

In genere, le voci di menu e i pulsanti della barra degli strumenti hanno più di uno stato. Per esempio , una voce di menu è grigiata (in grigio) se non è disponibile nel contesto attuale . Le voci di menu possono anche essere selezionate o deselezionate . Un pulsante della barra degli strumenti può anche essere disattivato se non è disponibile o può essere controllato.

Chi aggiorna lo stato di questi articoli mentre le condizioni del programma cambiano? Logicamente, se una voce di menu genera un comando gestito da, ad esempio, un documento , è opportuno che il documento aggiorni la voce di menu. Il documento contiene probabilmente le informazioni su cui è basato l'aggiornamento .

Se un comando ha più oggetti dell'interfaccia utente (forse una voce di menu e un pulsante della barra degli strumenti), entrambi sono instradato verso la stessa funzione del gestore. Questo incapsula il codice di aggiornamento dell'interfaccia utente per tutti gli oggetti dell'interfaccia utente equivalenti in una singola posizione .

Il framework fornisce una comoda interfaccia per l'aggiornamento automatico degli oggetti dell'interfaccia utente . È possibile scegliere per eseguire l'aggiornamento in altro modo, ma l'interfaccia fornita è efficiente e facile da usare.

Qual è la guida per .net Windows Forms? Sto usando un gestore di Application.Idle nel modulo principale ma non sono sicuro che questo sia il modo migliore per farlo. Più o meno nel tempo in cui ho messo tutti gli aggiornamenti UI nel gestore eventi Idle, la mia app ha iniziato a mostrare alcuni problemi di prestazioni e non ho ancora le metriche per rintracciarlo. Non sono sicuro se è correlato.

+0

Che cosa stai cercando di fare di nuovo? Stai cercando di disabilitare i controlli sulle applicazioni WinForms? –

+0

Disattiva/attiva pulsanti della barra degli strumenti, voci di menu, ecc. Seleziona/deseleziona lo stato dei pulsanti di controllo sulla barra degli strumenti, voci di menu che mostrano uno stato di controllo. Questo genere di cose. Roba molto di routine. –

+2

Sì, Application.Idle. Come si può avere un problema di perf quando l'app è inattiva è misteriosa. –

risposta

1

Ho trovato più semplice avere il gestore di eventi della voce di menu generare un thread in background che disabilita la voce di menu, esegue il lavoro e quindi riattiva la voce di menu. In questo modo, l'interfaccia utente è disponibile per gestire altre richieste di interfaccia utente e non è necessario eseguire il polling al termine dell'operazione.

Di solito includo la logica che impedisce più di una operazione che utilizza le stesse risorse per accadere contemporaneamente. Ciò significa creare una funzione per disabilitare/abilitare tutte le risorse simili contemporaneamente. per esempio. Potrei consentire l'esecuzione di 1 operazione di file alla volta, quindi creerò una funzione per disabilitare/abilitare tutte le voci di menu associate alle operazioni sui file e chiamarla da ognuna di quelle voci di menu.

0

Basta modificare la proprietà, ad es.

obj.Enabled = true; 

o

obj.Enabled = false; 

La proprietà di tale oggetto chiamerà automaticamente .Invalidate() o .Refresh() per voi, in modo che il controllo deve essere ridisegnata automaticamente.

Se si desidera eseguire un'attività GRANDE che bloccherebbe l'interfaccia utente per più secondi, vale la pena utilizzare Threads + Delegates.

+0

Ecco cosa faccio ora nel gestore Application.Idle nel modulo principale. Sto cercando di scoprire come e quando gli altri stanno facendo questo. Non riesco ad utilizzare l'associazione dati poiché i menu e le barre degli strumenti di devexpress che uso non offrono l'associazione dati per questo. –

+0

bene questo significherebbe far esplodere Application.Idle-handler per forme più grandi. davvero non dovresti farlo fallo quando necessario ad esempio: aggiungi un evento onclick a un pulsante. nel gestore, disabilitare un altro controllo. non metterlo in application.idle. –

1

AFAIK, nel mondo .NET System.Windows.Forms standard, questa funzionalità non è disponibile out-the-box. Questo problema può essere risolto in alcuni modi. I seguenti link sono risorse utili:

OnUpdate equivalent

ActionLists for Windows forms

Command UI Updating Windows Forms in C#

+1

Ho visto alcuni di questi collegamenti prima e ho la mia implementazione del modello di comando. Tutti questi ragazzi stanno utilizzando l'evento Application.Idle per l'aggiornamento. Immagino che non ci sia tutto. Il vecchio modo C++ MFC era piuttosto interessante. –

Problemi correlati