J'essaie d'améliorer la performance de My Treeview en WPF, lorsque vous ouvrez un nœud avec 6 000 enfants, il faut environ 13 secondes pour l'afficher. J'utilise une observatoire pour la collection enfant, avec un type de données liée au type transactionviewModel qui compte environ 7 colonnes, chacune tirant sur une pièce de données du modèle de vue. p>
Les champs de transaction pour les 6000 enfants sont créés et instanciés, mais comme vous n'avez pas affiché aucun d'entre eux visuellement, la première fois que vous développez le nœud, il faut les 13 secondes à afficher. Si vous contractez et développez le nœud, il s'affiche instantanément avec zéro heure d'affichage / charge. La seule différence que je peux voir, c'est que la première fois que chacune des propriétés de dépendance liées de la transactionviewModel a appelé Getter appelée par la liaison XAML, et lorsque vous êtes ré-développé la deuxième fois, rien de tout cela ne se produit alors que rien n'a changé, de sorte que WPF ne Appelez les getters à nouveau et il suffit probablement de conserver les informations reliées en mémoire pour la diffusion de la deuxième fois. P>
Donc, le dessin visuel de la commande est instantané, mais la première fois que vous l'ouvrez (même si les objets 6000 TransactionViewModelModel sont déjà entièrement chargés dans la collection d'enfants), purement le rendu des rangées est ce qui prend le temps. < / p>
Fait intéressant si je modifie la base de données pour ne pas se lier à des propriétés de dépendance de l'objet ViewModel et de sortir une grille vierge, il faut toujours 8 secondes à charger. Donc, même sans appels de liaison de données, la visionneuse d'arborescence prend 8 secondes pour rendant 6000 lignes. 5 secondes supplémentaires vous donne environ 5 colonnes de données liées par ligne, de sorte que ce coût est un coût petit par rapport au rendu de base. p>
8s pour rendre 6000 rangées vierges me semble très élevée. Y a-t-il des raisons majeures pour lesquelles cela pourrait se produire ou que des choses à prendre conscience de la présentation de XAML dans une arborescence des modèles de données? J'ai essayé d'utiliser juste un datablate vide - c'est-à-dire pas une grille blanche à l'intérieur et il faut toujours 7 secondes. p>
Étant donné qu'il s'effondre et se développe instantanément, pourquoi prend-il si longtemps la première fois que cela ne rendait même aucun xaml ni appeler des liaisons de données? P>
Aussi ASYNCH Les appels ne sont pas une solution car mon problème n'est pas une responsabilité de l'interface graphique, mais le temps pris pour charger des données. L'utilisateur doit avoir les données plus rapides qu'elles ne l'obtiennent maintenant. P>
Merci beaucoup P>
3 Réponses :
Votre problème est probablement ne pas rendu mais la mise en page - il doit instancier de nombreux éléments de l'interface utilisateur pour trouver la taille d'eux afin de pouvoir formater correctement un certain nombre d'éléments d'interface utilisateur (curseurs), et cela prend du temps. Rendu ne pénètre probablement pas du tout. P>
Est-ce juste une limitation du contrôle de l'arbreView alors? Comme tout ce que je fais, c'est ajouter des nœuds d'enfants vierges et cela prend toujours une durée raisonnable. La seconde chaque rangée commence, y compris les petites images d'icônes, sa presque inutilisable. Quelles astuces puis-je utiliser pour rendre cela plus rapide?
Cela me semble que vous devez activer la virtualisation dans l'arborescence. p>
Dans mon cas, c'était virtualisateur.isvirtualizing au lieu de VirtualizingStackpanel :: ISVirtualizing
Le lien est mort .. Mise à jour docs.microsoft. COM / EN-US / DOTNET / Framework / WPF / Avancé / ...
Si un arborescence contient de nombreux éléments, le temps nécessaire à la charge peut entraîner un retard important dans l'interface utilisateur. Vous pouvez améliorer le temps de chargement en définissant la propriété virtualisantestackpanel.isvirtualiser la propriété attachée à True. L'interface utilisateur peut également être lente à réagir lorsqu'un utilisateur fait défiler l'arborescence en utilisant la molette de la souris ou en faisant glisser le pouce d'une barre de défilement. Vous pouvez améliorer les performances de l'arborescence lorsque l'utilisateur fait défiler l'utilisateur en définissant la propriété VirtualizingStackpanel.VirtualizationAmode de carte à recycler. P>
Comment: améliorer la performance d'une arborescence p>
xaml: p>
xxx pré> programmatique: p>
xxx pré> blockquote>
Utilisez-vous la virtualisation? WPF ralentit lorsque vous commencez à rendre des milliers d'objets d'interface utilisateur, vous ne voulez généralement pas rendre les éléments visibles, pas tous, et simplement remplacer le DataContext derrière les commandes lorsque vous faites défiler. Je vérifierais également que c'est sûr que c'est le rendu de l'interface utilisateur causant le retard et ne pas charger les données.