Sto provando a migliorare le prestazioni con la mia applicazione WPF e sto avendo problemi con un ItemsControl complesso. Anche se ho aggiunto la virtualizzazione, c'è ancora un problema di prestazioni e penso di aver capito perché.C'è un modo di utilizzare la virtualizzazione con pannelli nascosti o espansioni?
Ogni articolo contiene una serie di aree espandibili. L'utente vede quindi un riepilogo all'inizio ma può eseguire il drill down espandendo per visualizzare ulteriori informazioni. Ecco come appare:
Come si può vedere, ci sono alcune ItemsControls nidificate. Quindi ognuno degli elementi di livello superiore ha un gruppo di controlli nascosti. La virtualizzazione impedisce il caricamento degli elementi fuori schermo, ma non gli oggetti nascosti all'interno degli elementi stessi. Di conseguenza, il layout iniziale relativamente semplice richiede molto tempo. Sfogliando alcune di queste visualizzazioni, l'87% del tempo è dedicato all'analisi e al layout e sono necessari alcuni secondi per caricarsi.
Preferisco che sia necessario 200 ms per espanderlo quando (se!) Decide l'utente, anziché 2 secondi per caricare la pagina nel suo complesso.
Chiedere consiglio davvero. Non riesco a pensare ad un buon modo di aggiungere i controlli usando MVVM comunque. Esiste un expander o virtualizzazione basata sulla visibilità supportata in WPF o dovrei creare la mia implementazione?
La figura 87% proviene da diagnostica:
Cosa sono * "oggetti nascosti all'interno degli articoli stessi" *? La virtualizzazione non creerà ['ContentPresenter'] (http://stackoverflow.com/a/12437064/1997232), ma da qualche parte hai' ObservableCollection <> 'che deve essere completamente caricato. Quindi, cosa include questo "2s"? Avete fatto il profiling per vedere cosa è in realtà un collo di bottiglia? – Sinatr
Vuoi virtualizzare parte dell'elemento che si trova all'interno di "Expander" (per gli oggetti creati)? In caso affermativo, puoi gestire lo stato compresso in ViewModel per ** aggiungere più dati ** quando è espanso (ad esempio usando 'object' per contenere dati e modelli dati per creare elementi visivi quando non è' null'). – Sinatr
Ecco come funziona il layout. È possibile ritardare l'acquisizione dei dati finché non è aperto. Sono sorpreso che impiega 2 secondi. – Paparazzi