Les panneaux que vous mentionnez sont des panneaux d'agencement. Un bref aperçu du système d'agencement suggère qu'il ne s'agira probablement pas d'une simple liste des panneaux les plus efficaces, mais de la façon dont vous utilisez les panneaux qui a le plus d'effet sur l'efficacité et les performances.
Système de mise en page (LayoutSystem_Overview) :
Dans sa forme la plus simple, la mise en page est un système récursif qui conduit à ce qu'un élément soit dimensionné, positionné et dessiné. Plus précisément, la mise en page décrit le processus de mesure et de disposition des membres de la collection Children d'un élément du Panel. La mise en page est un processus intensif. Plus la collection Children est grande, plus le nombre de calculs à effectuer est important. La complexité peut également être introduite en fonction du comportement de mise en page défini par l'élément Panel qui possède la collection. Un Panel relativement simple, tel que Canvas, peut avoir des performances nettement supérieures à un Panel plus complexe, tel que Grid.
Chaque fois qu'un UIElement enfant change de position, il est susceptible de déclencher un nouveau passage par le système de mise en page. Par conséquent, il est important de comprendre les événements qui peuvent invoquer le système de mise en page, car une invocation inutile peut entraîner de mauvaises performances de l'application. Les paragraphes suivants décrivent le processus qui se produit lorsque le système de mise en page est invoqué.
1. Un UIElement enfant commence le processus de mise en page en faisant d'abord mesurer ses propriétés principales.
2. Les propriétés de dimensionnement définies sur le FrameworkElement sont évaluées, telles que la largeur, la hauteur et la marge.
3. Une logique spécifique au panneau est appliquée, telle que la direction des quais ou l'orientation de l'empilement.
4. Le contenu est organisé après que tous les enfants ont été mesurés.
5. La collection Enfants est dessinée à l'écran.
6. Le processus est invoqué à nouveau si des enfants supplémentaires sont ajoutés à la collection, si une LayoutTransform est appliquée ou si la méthode UpdateLayout est appelée.
Ver Plage de mesure du système de mise en page pour plus d'informations sur la mesure et la disposition des enfants
Performances du système de mise en page :
La mise en page est un processus récursif. Chaque élément enfant d'une collection Children est traité lors de chaque invocation du système de mise en page. Par conséquent, il convient d'éviter de déclencher le système de mise en page lorsque cela n'est pas nécessaire. Les considérations suivantes peuvent vous aider à obtenir de meilleures performances.
Sachez quels changements de valeur de propriété forceront une mise à jour récursive par le système de mise en page.
Les propriétés de dépendance dont les valeurs peuvent entraîner l'initialisation du système de mise en page sont marquées par des drapeaux publics. AffectsMeasure et AffectsArrange fournissent des indices utiles sur les changements de valeur des propriétés qui forceront une mise à jour récursive par le système de mise en page. En général, toute propriété susceptible d'affecter la taille du rectangle englobant d'un élément doit avoir un indicateur AffectsMeasure défini sur true. Pour plus d'informations, consultez la rubrique Présentation des propriétés de dépendance.
Dans la mesure du possible, utilisez une RenderTransform au lieu d'une LayoutTransform.
Une LayoutTransform peut être un moyen très utile d'affecter le contenu d'une interface utilisateur (IU). Toutefois, si l'effet de la transformation ne doit pas avoir d'incidence sur la position d'autres éléments, il est préférable d'utiliser une RenderTransform à la place, car celle-ci n'invoque pas le système de mise en page. LayoutTransform applique sa transformation et force une mise à jour récursive de la disposition pour tenir compte de la nouvelle position de l'élément affecté.
Évitez les appels inutiles à UpdateLayout.
La méthode UpdateLayout force une mise à jour récursive de la disposition, et n'est souvent pas nécessaire. À moins que vous ne soyez certain qu'une mise à jour complète est nécessaire, laissez le système de mise en page appeler cette méthode pour vous.
Lorsque vous travaillez avec une grande collection d'enfants, envisagez d'utiliser un VirtualizingStackPanel au lieu d'un StackPanel ordinaire.
En virtualisant la collection enfant, le panneau VirtualizingStackPanel ne garde en mémoire que les objets qui se trouvent actuellement dans le ViewPort du parent. Par conséquent, les performances sont considérablement améliorées dans la plupart des scénarios.
Optimisation des performances : Mise en page et conception : Cet article explique en détail comment construire efficacement l'arbre et donne une liste simple des panneaux en fonction de leur complexité.
Canevas (le moins complet possible = plus efficace et meilleure performance)
Grille
Autres panneaux (plus complexes = moins efficaces et moins performants)
Autres considérations relatives à la performance auxquelles il faut prêter attention : Façons d'améliorer la vitesse de rendu de l'interface utilisateur WPF
- Mettez tout en cache. Brosses, couleurs, géométries, textes formatés, glyphes. (Par exemple, nous avons deux classes : RenderTools et TextCache. Le processus de rendu de chaque unité est adressé à une instance partagée des deux classes. Ainsi, si deux graphiques ont le même texte, sa préparation n'est exécutée qu'une seule fois).
- Congeler Congelable, si vous prévoyez de l'utiliser pendant une longue période. Surtout les géométries. Les géométries complexes non gelées exécutent HitTest extrêmement lentement.
- Choisissez les méthodes de rendu les plus rapides pour chaque primitive. Par exemple, il existe environ 6 façons de rendre du texte, mais la plus rapide est DrawingContext.DrawGlyphs.
- Permettre le recyclage des conteneurs. La virtualisation apporte beaucoup d'améliorations de performance, mais les conteneurs seront éliminés et recréés, c'est le cas par défaut. Mais vous pouvez gagner en performance en recyclant les conteneurs en définissant VirtualizingStackPanel.VirtualizationMode="Recycling".
- Desde aquí : Il n'y a pas de limite pratique à la quantité d'imbrication que votre application peut supporter, cependant, il est généralement préférable de limiter votre application à l'utilisation des panneaux qui sont réellement nécessaires pour la mise en page souhaitée. Dans de nombreux cas, un élément Grid peut être utilisé à la place des panneaux imbriqués en raison de sa flexibilité en tant que conteneur de mise en page. Cela peut améliorer les performances de votre application en évitant que des éléments inutiles ne se retrouvent dans l'arborescence.
0 votes
Est-il naïf de supposer que les panneaux virtualisés seront invariablement plus performants que les panneaux non virtualisés ?
0 votes
@BoltClock Je pense que cela dépend de la quantité de contenu non visible dans le panneau. S'il y a beaucoup d'éléments non visibles, une
VirtualizingStackPanel
sera certainement plus performant, mais si tous les éléments affichés dans le panneau sont visibles, je pense qu'il est préférable d'utiliser un panneau normal.0 votes
Merci. Il est logique que ce soit un gaspillage de virtualiser des éléments, alors qu'ils s'afficheront tous de toute façon.
0 votes
À part la virtualisation, ils ont des fonctionnalités différentes, sinon ils ne seraient pas des contrôles séparés. J'opte pour ce qui offre la meilleure interface utilisateur au client.
0 votes
@Blam A titre d'exemple, l'écran sur lequel je travaillais lorsque j'ai posté cette question a un
TextBlock
suivi d'un en-tête horizontalLine
alors aContentControl
remplissant le reste de l'écran. Il y avait également unButton
dans le coin supérieur droit qui s'alignait avec l'en-tête. J'essayais de décider si je devais utiliser une baliseGrid
, aDockPanel
ou unStackPanel
. Certains d'entre eux nécessiteraient des panneaux imbriqués, d'autres non. Je sais qu'il existe une différence de vitesse de rendu entre les panneaux, car j'ai déjà vu un article à ce sujet, mais je ne me souviens plus où0 votes
Oh, dans ce cas, je pense que c'est Grid s'il doit remplacer plusieurs contrôles qui doivent avoir la même taille et je pense avoir lu cela quelque part mais je ne le trouve pas non plus.
1 votes
Êtes-vous sûr qu'il y a une différence notable (à part la virtualisation) ? Tout ce qu'ils ont à faire est d'exécuter un algorithme de mise en page relativement léger. C'est minuscule comparé à tout le rendu qui suivra. Cela dit, la grille sera probablement la plus lente (mise à l'échelle pondérée).
0 votes
@HenkHolterman Il se peut qu'il n'y ait pas beaucoup de différence dans une IU simple, mais j'ai remarqué des différences dans des IU plus complexes, telles que la
ItemsPanelTemplate
pour unItemsControl
plein d'articles. Par exemple, voici une citation que j'ai trouvée sur MSDN :A relatively simple Panel, such as Canvas, can have significantly better performance than a more complex Panel, such as Grid.
0 votes
Je n'ai pas répondu directement à tous les points de votre question, mais j'ai essayé d'atteindre tout ce dont vous auriez besoin pour prendre une décision éclairée sur le panneau à utiliser dans un cas particulier. Faites-moi savoir si vous avez besoin de quelque chose d'autre.