mercoledì 22 dicembre 2010

Ottimizzare il controllo ListBox su phone 7

Se utilizzate il controllo ListBox per visualizzare e scorrere centinaia di item noterete una fluidità non meravigliosa, soprattutto se gli item contengono immagini. Ovviamente se la vostra listbox contiene poche decine di item potete tranquillamente utilizzarlo così com'è.
Leggendo il post Never do today what you can put off till tomorrow  di David Anson ho trovato alcune soluzioni interessanti, l'utilizzo di LowProfileImageLoader per il caricamento asincrono delle immagini e DeferredLoadListBox migliorare le prestazioni del listbox contol.
Per prima cosa se avete delle immagini che caricate dalla rete è necessario farle caricare non al trhead della UI, ma in modo asincrono, e potete utilizzare facilmente la classe LowProfileImageLoader. Questa classe ha migliorato di parecchio la fluidità delle mie listbox.. praticamente utilizza un worker thread per caricarsi le immagini.
Il controllo ListBox utilizzando al suo interno un VirtualizingStackPanel riesce a mantenere basso il consumo di memoria. Il  VirtualizingStackPanel riesce ad allocare solo i containers degli item visibili, riciclandoli quando si scorrono gli item. Quindi riesce a mantenere basso il numero di containers anche quando abbiamo un elevato numero di item. Purtroppo questo pesa a volte sul nostro UI thread, diminuendo la fluidità dello scrolling. Cosa succede se invece carico tutti i containers ? Basta sostituire il listbox con uno stackpanel, questo migliora la fluidità ma caricandovi tutti gli elementi vi richiede più memoria ed è più lento nella fase di caricamento iniziale.
In questo caso ci viene in aiuto la DeferredLoadListBox, praticamente fa in modo che il nostro listbox si comporti come uno stackpanel "evoluto", in pratica posticipa il caricamento degli item non visbili, in questo modo si migliora il tempo di caricamento iniziale ma il consumo della memoria, man mano che si scorrono gli elementi, aumenterà fino ad essere similare al consumo dello stackpanel. 


Possiamo dire quindi che la fluidità si paga in termini di memoria allocata, valutate a seconda delle vostre esigenze cosa vi conviene utilizzare.

Nessun commento:

Posta un commento