2009-09-07 16 views
32

Vorrei una semplice descrizione di come implementare un virtualizingstackpanel per un ItemsControl che è un database su un ObservableCollection nel mio MVVM.WPF VirtualizingStackPanel per prestazioni migliorate

Ho un'istanza ItemsControl per ogni scheda in un controllo struttura a schede e le schede di commutazione diventano MOLTO lente quando lo ItemsControl diventa più grande.

Cosa posso fare per accelerare l'app?

Ho aperto un profiler WPF e ho visto che ogni elemento (che è un controllo utente personalizzato) visualizzato nel mio ItemsControl di ogni scheda aveva il suo ContentPresenter. Quindi in sostanza avevo 100 presentatori di contenuti tutti in esecuzione per 100 elementi nel mio ObservableCollection in MVVM. Questo è corretto? Come posso ottimizzare?

risposta

48

Ci sono due tecniche che potrebbero essere di grande aiuto. Entrambi sono descritti molto bene da Bea Stolnitz sul suo blog.

Il primo è UI Virtualization e il secondo è Data Virtualization

In virtualizzazione interfaccia utente di utilizzare le cose come VirtualizingStackPanel per rendere l'interfaccia utente disegnare meno cose.

virtualizzazione dei dati rende sicuro di non portare un milione di oggetti in memoria quando si sta solo andando a mostrare 100.

virtualizzazione Così UI riduce al minimo il numero di cose disegnato e virtualizzazione dei dati riduce al minimo il numero di cose che potrebbero essere disegnato.

Speranza che aiuta

9

ho avuto esattamente lo stesso problema ind WPF utilizzando TabControl e DataGrid. Aumentando la dimensione dell'elemento DataGrid, le schede di commutazione diventano MOLTO lente! Dopo di ciò ho trovato questo post leggendo il blog di Bea Stolnitz come supposto dalla risposta precedente. Che mi ha dato il suggerimento di google "WPF TabControl VirtualizingStackPanel" che mi dà il link per DrWPF: http://groups.google.com/group/wpf-disciples/browse_thread/thread/6f3531a1720252dd

Egli descrive esattamente il problema e dà la soluzione :-))

.... Il colpo perf è durante la costruzione dell'albero. Sfortunatamente, se
si sta utilizzando un tipico approccio MVVM con un'associazione sulla proprietà ItemsSource
di TabControl, l'intero albero deve essere ricreato ogni volta
un elemento di tabulazione è selezionato. Questa è di solito un'operazione molto costosa. ....

Problemi correlati