2010-02-26 12 views
10

Attualmente sto lavorando su un programma che utilizza una struttura abbastanza complessa di controlli di winform annidati che cambia dinamicamente mentre un utente effettua determinate selezioni. Per approfondire la specifica disposizione dei controlli sarebbe estesa a questa domanda.Come risolvere i problemi di sfarfallio del controllo delle winform nidificati

Quando viene effettuata una selezione, vengono apportati molti aggiornamenti al modello sottostante controllato dai controlli utente. Ciò comporta quindi una serie di modifiche corrispondenti nella dimensione/posizione/visibilità dei controlli visualizzati. Tutti questi cambiamenti provocano uno sfarfallio intensamente doloroso dei controlli sullo schermo. Ho bisogno di risolvere in qualche modo questo in modo che ogni volta che l'utente fa una selezione lo schermo è fondamentalmente congelato fino al completamento di tutti gli aggiornamenti di controllo.

Ho tentato di utilizzare i metodi Control.SuspendLayout/Control.ResumeLayout in molti diversi modi e modi e non riesco a eliminare lo sfarfallio pazzesco. Ho pensato che la sospensione del layout sul controllo root durante le modifiche avrebbe risolto il problema, ma sembra che questo SuspendLayout non aiuti quando vengono modificati i controlli figlio.

Devo utilizzare qualche altro approccio piuttosto che SuspendLayout? C'è un modo in cui posso eseguire il debug di SuspendLayout per capire perché non sembra essere in cascata a tutti i controlli figlio?

+0

questa risposta ha funzionato per me http://stackoverflow.com/questions/487661/how-do-i-suspend-painting-for-a-control-and-its-children – wal

risposta

0

Utilizzare SetControlStyles nel controllo utente, la bandiera è OptimizedDoubleBuffer che impedirà lo sfarfallio.

2

Oltre al suggerimento di @ tommieb75 per il doppio buffering, è possibile provare e verificare se i controlli di livello root hanno coppie di metodi BeginUpdate/EndUpdate. Questi dovrebbero aiutare a reprimere i ripetitori tra le chiamate.

+1

Un altro paio di metodi per essere a conoscenza di è 'SuspendLayout()' e 'ResumeLayout()' che sospenderanno/riprenderanno la verniciatura del controllo – STW

0

Se si utilizza WinForms 2+, è possibile impostare semplicemente "Controllo". DoubleBuffer 'proprietà sul controllo su true (anche nel designer).

Con framework 2, l'impostazione di DoubleBuffered imposta i 3 flag: OptimizedDoubleBuffer, AllPaintingInWmPaint e un altro che ho dimenticato, 'UserPaint' forse.

Inoltre, controllare la data di inizio/fine aggiornamento come menzionato da @yetapb.

14

Suspend/ResumeLayout non è un problema qui. Questo sospende solo il layout automatico, il tipo attivato dalle proprietà Anchor e Dock. Il doppio buffering non è in grado di risolvere il problema, che elimina solo lo sfarfallio in ogni singolo controllo. Il tuo vero problema è che stai aggiornando troppi controlli contemporaneamente, ognuno di essi prenderà il suo turno per dipingere se stesso e che richiede tempo.

Quello che ti serve è un diverso tipo di doppio buffering, compositing. Controlla se la soluzione in this thread risolve il tuo problema.

+1

Yay, un modo in più :) Spero di ricordarlo quando ne ho bisogno. –

+0

+1 hai salvato la mia giornata (anche se è tardi nella notte ...) – karlipoppins

+0

Grazie .. ha risparmiato il mio tempo =) – Emo

Problemi correlati