Les panneaux que vous mentionnez sont des panneaux de disposition, donc un bref aperçu du système de disposition 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 ont le plus grand effet sur l'efficacité et les performances.
LayoutSystem_Overview :
Dans sa forme la plus simple, la mise en page est un système récursif qui conduit à dimensionner, positionner et dessiner un élément. Plus spécifiquement, la mise en page décrit le processus de mesure et d'organisation des membres de la collection Children d'un élément 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 disposition défini par l'élément Panel qui possède la collection. Un Panel relativement simple, tel que Canvas, peut avoir des performances nettement meilleures qu'un Panel plus complexe, tel que Grid.
Chaque fois qu'un UIElement enfant change de position, il a le potentiel de déclencher une nouvelle passe par le système de disposition. Par conséquent, il est important de comprendre les événements qui peuvent appeler le système de disposition, car une invocation inutile peut entraîner de mauvaises performances de l'application. Ce qui suit décrit le processus qui se produit lorsque le système de disposition est appelé.
1. Un UIElement enfant commence le processus de mise en page en mesurant d'abord ses propriétés de base.
2. Les propriétés de dimensionnement définies sur FrameworkElement sont évaluées, telles que Largeur, Hauteur et Marge.
3. Une logique spécifique au panneau est appliquée, telle que la direction du quai ou l'orientation de l'empilement.
4. Le contenu est organisé une fois que tous les enfants ont été mesurés.
5. La collection Children est dessinée à l'écran.
6. Le processus est à nouveau appelé si des enfants supplémentaires sont ajoutés à la collection, un LayoutTransform est appliqué ou si la méthode UpdateLayout est appelée.
Voir LayoutSystem_Measure_Arrange pour plus d'informations sur la mesure et l'organisation des enfants
LayoutSystem_Performance :
La mise en page est un processus récursif. Chaque élément enfant d'une collection Children est traité lors de chaque appel du système de disposition. En conséquence, le déclenchement du système de mise en page doit être évité lorsqu'il n'est pas nécessaire. Les considérations suivantes peuvent vous aider à obtenir de meilleures performances.
Soyez conscient des changements de valeur de propriété qui 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 disposition sont marquées avec des indicateurs publics. AffectsMeasure et AffectsArrange fournissent des indices utiles sur les changements de valeur de propriété qui forceront une mise à jour récursive par le système de mise en page. En général, toute propriété qui peut affecter la taille du cadre de sélection d'un élément doit avoir un indicateur AffectsMeasure défini sur true. Pour plus d'informations, consultez Vue d'ensemble des propriétés de dépendance.
Lorsque cela est possible, utilisez un RenderTransform au lieu d'un LayoutTransform.
Un LayoutTransform peut être un moyen très utile d'affecter le contenu d'une interface utilisateur (UI). Toutefois, si l'effet de la transformation ne doit pas avoir d'impact sur la position d'autres éléments, il est préférable d'utiliser un RenderTransform à la place, car RenderTransform n'appelle pas le système de disposition. 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 de la disposition récursive et n'est souvent pas nécessaire. Sauf si vous êtes sûr qu'une mise à jour complète est nécessaire, comptez sur le système de mise en page pour appeler cette méthode pour vous.
Lorsque vous travaillez avec une grande collection Children, envisagez d'utiliser un VirtualizingStackPanel au lieu d'un StackPanel normal.
En virtualisant la collection enfant, VirtualizingStackPanel ne conserve en mémoire que les objets qui se trouvent actuellement dans le ViewPort du parent. En conséquence, 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 créer efficacement l'arborescence et donne une liste simple de panneaux en fonction de leur complexité
Canvas (le moins complexe = plus efficace et de meilleures performances)
la grille
Autres panneaux (plus complexes = moins efficaces et moins performants)
Autres considérations de performances à prendre en compte: Moyens d'améliorer la vitesse de rendu de l'interface utilisateur WPF
- Cachez tout. Pinceaux, couleurs, géométries, textes formatés, glyphes. (Par exemple, nous avons deux classes: RenderTools et TextCache. Le processus de rendu de chaque unité adresse une instance partagée des deux classes. Donc, si deux graphiques ont le même texte, sa préparation est exécutée une seule fois.)
- Freeze Freezable, 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 de chaque primitive. Par exemple, il existe environ 6 méthodes de rendu de texte, mais la plus rapide est DrawingContext.DrawGlyphs.
- Activez le recyclage des conteneurs. La virtualisation apporte de nombreuses améliorations de performances, mais les conteneurs seront supprimés et recréés, c'est la valeur par défaut. Mais vous pouvez gagner plus de performances en recyclant les conteneurs en définissant VirtualizingStackPanel.VirtualizationMode = "Recycling"
- À partir de là : il n'y a pas de limite pratique à la quantité d'imbrication que votre application peut prendre en charge, cependant, il est généralement préférable de limiter votre application pour n'utiliser que les 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 de panneaux imbriqués en raison de sa flexibilité en tant que conteneur de disposition. Cela peut augmenter les performances de votre application en gardant les éléments inutiles hors de l'arborescence.