Ho un'applicazione SL con molti DataGrid (da Silverlight Toolkit), ognuno con la propria vista. Se vengono aperti più DataGrid, la modifica tra le viste (ad esempio TabItems) richiede molto tempo (alcuni secondi) e congela l'intera applicazione (thread dell'interfaccia utente).Prestazioni Silverlight con molti controlli caricati
Più DataGrid vengono caricati, maggiore è il tempo richiesto. Questi DataGrid che rallentano la variazione dell'interfaccia utente potrebbero trovarsi in altri punti dell'app e non essere nemmeno visibili in quel momento. Ma una volta aperti (e caricati con i dati), rallentano la visualizzazione di altri DataGrid. Si noti che i DataGrid NON sono disposti e quindi ricreati di nuovo, rimangono ancora in memoria, solo il loro controllo genitore è nascosto e visibile di nuovo.
Ho profilato l'applicazione. Mostra che la funzione SetValue di agcore.dll è il collo di bottiglia. Sfortunatamente, i simboli di debug non sono disponibili per questa libreria nativa di Silverlight responsabile del disegno.
Il problema non è nel controllo DataGrid. Ho provato a sostituirlo con la griglia di XCeed e le prestazioni quando si cambiano le viste sono ancora peggiori.
Avete qualche idea su come risolvere questo problema? Perché più controlli aperti rallentano altri controlli?
ho creato un esempio che illustra il problema: VS solution, live demo
UPDATE: Uso VS11 profilatore sul campione suggerisce che il problema poteva essere MeasureOverride essere chiamato molte volte (per ogni DataGridCell, I indovina). Ma ancora, perché è più lento come più controlli vengono caricati altrove? C'è un modo per migliorare le prestazioni?
UPDATE 2: Devo dire che non uso TabControl nella mia particolare applicazione. Uso Caliburn.Micro e ContentControl per mostrare ViewModel attualmente attivo. Ma lo stesso problema è con TabControl, quindi l'ho usato per descrivere il problema principale.
Vedi la discussione qui (la punta circa TabControl), è potrebbe aiutare: http://stackoverflow.com/questions/1389769/wpf-virtualizingstackpanel-for-increased-performance – Phil
In realtà, nella mia applicazione originale, utilizzo Caliburn.Micro (MVVM framework) così invece di un TabControl, ho un ContentControl associato a ViewModel attualmente attivo (e quindi alla sua vista). Tuttavia, controllerò la discussione e ti farò sapere. Grazie! – gius
filedropper 404'ed –