Tengo una aplicación SL con muchos DataGrids (desde Silverlight Toolkit), cada uno en su propia vista. Si se abren varios DataGrids, el cambio entre vistas (TabItems, por ejemplo) lleva mucho tiempo (unos segundos) y congela toda la aplicación (subproceso de interfaz de usuario).Rendimiento de Silverlight con muchos controles cargados
Cuantos más DataGrids se carguen, más tardará el cambio. Estos DataGrids que ralentizan el heap de UI pueden estar en otros lugares de la aplicación y no ser visibles en ese momento. Pero una vez que se abren (y se cargan con datos), se ralentizan mostrando otros DataGrids. Tenga en cuenta que los DataGrids NO se eliminan y luego se vuelven a crear, aún permanecen en la memoria, solo su control principal se oculta y se vuelve a ver.
He creado un perfil para la aplicación. Muestra que la función SetValue de agcore.dll es el cuello de botella. Lamentablemente, los símbolos de depuración no están disponibles para esta biblioteca nativa de Silverlight responsable del dibujo.
El problema no está en el control DataGrid: intenté reemplazarlo con la cuadrícula de XCeed y el rendimiento al cambiar las vistas es aún peor.
¿Tiene alguna idea de cómo resolver este problema? ¿Por qué más controles abiertos ralentizan otros controles?
He creado un ejemplo que muestra este problema: VS solution, live demo
ACTUALIZACIÓN: El uso de perfiles VS11 de la muestra prevista sugiere que el problema podría estar en MeasureOverride ser llamado muchas veces (para cada DataGridCell, me adivinar). Pero aún así, ¿por qué es más lento a medida que se cargan más controles en otros lugares? ¿Hay alguna forma de mejorar el rendimiento?
ACTUALIZACIÓN 2: Debo mencionar que no uso TabControl en mi aplicación particular. Uso Caliburn.Micro y ContentControl para mostrar ViewModel actualmente activo. Pero el mismo problema es con TabControl, así que lo usé para describir el problema central.
Véase la discusión aquí (lo de TabControl), se puede ayudar: http://stackoverflow.com/questions/1389769/wpf-virtualizingstackpanel-for-increased-performance – Phil
En realidad, en mi aplicación original, uso Caliburn.Micro (framework MVVM) así que en lugar de un TabControl, tengo un ContentControl vinculado a ViewModel actualmente activo (y por lo tanto su vista). Sin embargo, verificaré la discusión y te haré saber. ¡Gracias! – gius
filedropper 404'ed –