6
votes

Comment puis-je accélérer le rendu de la liste de liste et le filtrage ListCollectionView?

Une question à deux volets ici, mais je pense que ces deux sujets sont suffisamment enlavés pour justifier leur inclusion ensemble.

Dans notre application, nous avons une liste listbox , qui est renseignée avec ce qui pourrait être un grand nombre d'éléments. Chacun de ces éléments est affiché avec un modèle d'élément plutôt compliqué. C'est nécessairement plutôt compliqué, et bien que cela puisse potentiellement être paré un peu plus, je ne pouvais probablement pas prendre beaucoup de choses. Les éléments de la liste listbox proviennent d'un listCollectionview Construit à partir d'un Observablecollection <> des objets à afficher.

Nous avons deux problèmes.

Le premier est que lorsque nous reconfigurons des filtres pour le listCollectionview et appelez rafraîchissez dessus, il y a un verrouillage très notifable de quelques secondes dans l'interface utilisateur. Il est déchiré et recréé, et la liste repeupline. La durée de ce verrouillage semble être liée au nombre d'éléments contenus dans la liste et la plus longue lorsque la zone client de la liste est pleine d'articles. Nous sommes assez sûrs que le lock-up est causé par les modèles d'articles recréés. J'ai essayé d'allumer la virtualisation, mais cela n'avait aucun effet dans la réduction ou l'élimination du ralentissement. Je regarde également d'autres optimisations, comme examiner nos liaisons et modifier les mises en page. Existe-t-il une méthode pour éviter ce problème particulier, l'accélérer ou le déplacer à un fil différent? (Je sais que le dernier est fortement improbable parce que le rendu est tout à fait fileté, mais peut-être qu'il y a quelque chose de contournement ...)

La seconde concerne le filtrage sur le listCollectionvoir . Bien que ce n'était pas un problème actuel, nous pensons qu'il existe un potentiel de filtrage de devenir un problème et de provoquer un verrouillage notable sur le fil de l'interface utilisateur. Je travaille pour réduire les frais généraux de filtrage, mais je me demandais s'il y a une méthode de déplacement de l'appel d'actualisation sur le ListCollectionview sur un autre fil? Aucune de mes tentatives jusqu'à présent n'a réussi, apparemment parce que le listCollectionview ne fait pas automatiquement ménager certains événements sur le bon fil.

Les pointeurs ou explications de toutes les solutions connues ou potentielles à ces deux problèmes seraient très utiles.


2 commentaires

J'ai le même problème avec mon projet WPF. Avez-vous trouvé une solution ?


Cela fait longtemps :) Je semble vous rappeler que nous avons vraiment optimisé le gabarit et avons refacturé le filtrage pour déplacer la majorité d'entre eux sur un fil différent. Qui a rendu le verrouillage beaucoup moins perceptible. Malheureusement, j'ai changé d'emploi depuis, donc je ne sais pas si aucun autre travail a été fait. Il se peut qu'ils se sont peut-être passés à une tierce partie ListBox -itant -itant le contrôle qui fonctionne mieux - nous l'avons fait pour nos grilles.


3 Réponses :


1
votes

2 conseils de ici , le premier pourrait aider à virtualiser la liste < / code>:

Virtualize Listes et vues à l'aide d'un VirtualizingStackpanel comme ÉlémentsPanel pour les listes. Cela crée uniquement les éléments visibles à temps de chargement. Tous les autres éléments sont créés paresseux quand ils sont visibles. Sachez que grouper ou cancontentscroll = "true" empêche la virtualisation!

Activer le recyclage du conteneur. La virtualisation apporte beaucoup d'améliorations de performance, mais les conteneurs seront disposés et réagis, c'est la valeur par défaut. Mais vous pouvez gagner plus de performances par des conteneurs de recyclage en réglant virtualizingstackpanel.virtualizationMode = "recyclage"

J'ai fait la virtualisation de ma énorme liste d'objets par la technique décrite ici sur codeProject , ça marche bien


2 commentaires

C'est un article intéressant. Cela pourrait être utile lorsque nous lisons dans les objets qui apparaissent dans la liste de liste; Je vais jeter un oeil à la mise en œuvre. En ce qui concerne la VirtualizingStackpanel: je l'ai mise en place, mais malheureusement, il n'a pas abordé la liste de la liste de la liste. Merci quand même.


L'affiche originale a une question valable impliquant ListCollectionview et a déjà activé la virtualisation. Je rencontre ce même problème: l'actualisation semble recréer les articles. J'ai déjà confirmé que la virtualisation fonctionne par défilement, mais lorsque je filtre ou trier à l'aide de la vue, WPF a recréé tous les éléments de la liste de réception.



2
votes

Quelques idées intéressantes dans Ce SO thread sur le rendu de DataGrid et la liaison - Vous pourrez peut-être les appliquer dans votre scénario de liste de liste ...


1 commentaires

Je pense que cela pourrait être une solution potentielle si nous ajoutions ou supprimons des articles. Lors de l'application d'un filtre cependant, il semble que la liste de liste soit repeuplée. S'il est inévitable, le stand qui l'accompagne, qui est légèrement ennuyeux. Un symptôme du rendu à filetage unique du WPF. Espérons que, il y aura un remède contre cela à l'avenir. Pour le moment, je suppose que je devrai essayer d'optimiser notre type de données. Acclamations.



2
votes

Je ne pense pas que vous puissiez virtualiser et filtrer en même temps. Donc, si j'étais à vos chaussures, je serais dans une zone de liste virtualisante et faire la logique filtrante dans un autre fil. Bien sûr, vous devrez peut-être écrire du code déjà écrit auparavant, mais s'il ne verrouille pas votre interface graphique? La peine.


0 commentaires