2012-12-07 25 views
21

Nell'applicazione .NET 3.5WPF, ho un WPFDataGrid che verrà popolato con 500 colonne e 50 righe. Le prestazioni di App sono molto scarse nello scorrimento, o quando faccio DataGrid.Items.Refresh() o nella selezione di righe.Migliora prestazioni DataGrid WPF

In realtà l'applicazione impiegherà circa 20 secondi per aggiornare il layout. L'evento Layout_Updated() si attiverà dopo 20 secondi.

Se riduco le colonne a 50 o meno, App sarà molto reattiva. Come per i miei risultati, le prestazioni sono direttamente correlate al conteggio delle colonne.

Come si migliora la prestazione DataGrid?

+6

Una griglia con più di 10 colonne potrebbe non essere una buona idea, ma considera "Paging personalizzato" – Boomer

+4

@ Boomer Really? MAI visto una griglia forex? – TomTom

+0

@WPFK Hai considerato di usare un terzo par griglia che è ottimizzata per le prestazioni? – TomTom

risposta

57

Ci sono alcune opzioni che si possono accendere per aiutarvi nel vostro DataGrid oggetto

EnableColumnVirtualization = true 
EnableRowVirtualization = true 

Questi due sono i principali che penso possano aiutare. Successivo provare a fare l'asincrone vincolante

ItemsSource="{Binding MyStuff, IsAsync=True}" 

E, infine, ho sentito dire che l'impostazione di un massimo di altezza e la larghezza può aiutare anche se al di sopra della dimensione massima dello schermo, ma non ho notato una differenza di me (richiesta è stata a che fare con il formato che misura automatica)

MaxWidth="2560" 
MaxHeight="1600" 

anche non mettere un DataGrid in un ScrollViewer, perché si perde essenzialmente virtualizzazione. Fammi sapere se questo aiuta!

+0

Non penso che EnableColumnVirtualization e EnableRowVirtualization siano disponibili fino a .NET 4.0. Quindi l'OP dovrebbe essere aggiornato da 3.5 prima di esaminare i primi suggerimenti. – Scott

+0

@Scott Bene, questa potrebbe essere una soluzione ragionevole. Per l'OP, perché stai usando .NET 3.5? .NET 4.0 è disponibile su XP SP3 e molte librerie di terze parti richiedono già .NET 4.0 se si desidera utilizzarle. – Alan

+0

@Alan Great man !!! Mi ha aiutato molto ... – Kishor

0

forse provare questo invece di caricare tutte le 50 righe in una volta

http://www.codeproject.com/Articles/34405/WPF-Data-Virtualization

+0

Grazie per i suggerimenti. Ma il mio requisito per avere 500 colonne contemporaneamente. – Kishor

+1

bene hai detto scrolling quindi ho pensato di non visualizzare tutte le righe contemporaneamente (come fai comunque con 500 cols) L'idea con la virtualizzazione dei dati è che carichi un certo numero per popolare la tua griglia e poi rimuovi e sostituisci le righe mentre scorri – Constanta

0

isAsync = True}" è più veloce dopo aver usato questa dichiarazione, l'applicazione recupera un sacco di record in poco tempo, ha funzionato per me ...

+1

IAsync = Vero dove? che cosa? Assolutamente poco chiaro –

+0

guarda più avanti dice "ItemsSource =" {Binding MyStuff, IsAsync = True} "" – Sam

1

Verificare che sia stato impostato proprietà ScrollViewer.CanContentScrollFalse. impostazione di questa proprietà per falsi disabilita la virtualizzazione in un modo peggiorerà le prestazioni della tua griglia di dati.Per ulteriori chiarimenti, consulta questo CanContentScroll