Optimisation des performances : contrôles

Mise à jour : Juillet 2008

Windows Presentation Foundation (WPF) comporte de nombreux composants d'interface utilisateur communs utilisés dans la plupart des applications Windows. Cette rubrique présente des techniques qui permettent d'améliorer les performances de votre interface utilisateur.

Cette rubrique comprend les sections suivantes.

  • Affichage de grands groupes de données
  • Recyclage de conteneurs
  • Prise en charge de la virtualisation bidirectionnelle
  • Optimisation des modèles
  • Défilement différé
  • Contrôles implémentant des fonctionnalités de performances
  • Rubriques connexes

Affichage de grands groupes de données

Les contrôles WPF, tels que ListView et ComboBox, permettent d'afficher des listes d'éléments dans une application. Si la liste à afficher est longue, les performances de l'application risquent de s'en trouver affectées. Cela s'explique par le fait que le système de disposition standard crée un conteneur de disposition pour chaque élément associé au contrôle de liste, puis calcule la taille et la position de sa disposition. En règle générale, vous n'avez pas à afficher tous les éléments simultanément ; au lieu de cela, vous en affichez un sous-ensemble et l'utilisateur fait défiler la liste. Dans ce cas, le recours à la virtualisation de l'interface utilisateur est justifiée : la génération du conteneur d'élément et le calcul de la disposition qui y est associée pour un élément sont différés jusqu'à ce que cet élément soit visible.

La virtualisation de l'interface utilisateur est un aspect important des contrôles de liste. La virtualisation de l'interface utilisateur ne doit pas être confondue avec la virtualisation des données. La virtualisation de l'interface utilisateur stocke uniquement les éléments visibles dans la mémoire ; dans un scénario de liaison de données, elle stocke l'intégralité de la structure de données dans la mémoire. En revanche, la virtualisation des données stocke uniquement les éléments de données qui sont visibles à l'écran dans la mémoire.

Par défaut, la virtualisation de l'interface utilisateur est activée pour les contrôles ListView et ListBox lorsque leurs éléments de liste sont liés aux données. La virtualisation TreeView peut être activée en affectant à la propriété jointe VirtualizingStackPanel.IsVirtualizing la valeur true. Pour activer la virtualisation de l'interface utilisateur des contrôles personnalisés qui dérivent d'ItemsControl ou de contrôles d'élément existants qui utilisent la classe StackPanel, telle que ComboBox, vous pouvez affecter à ItemsPanel la valeur VirtualizingStackPanel et affecter à IsVirtualizing la valeur true. Vous risquez malheureusement de désactiver la virtualisation de l'interface utilisateur de ces contrôles sans vous en rendre compte. La liste des conditions qui désactivent la virtualisation de l'interface utilisateur est la suivante.

Actuellement, aucun contrôle WPF n'assure la prise en charge intégrée de la virtualisation des données.

Recyclage de conteneurs

Le recyclage de conteneurs optimise la virtualisation de l'interface utilisateur ajoutée au .NET Framework 3.5 SP1 pour les contrôles qui héritent d'ItemsControl et peut également améliorer les performances de défilement. Lors du remplissage d'un ItemsControl qui utilise la virtualisation de l'interface utilisateur, celui-ci crée un conteneur d'élément pour chaque élément qui défile de manière visible et détruit le conteneur d'élément de chaque élément qui défile de manière invisible. Le recyclage de conteneurs permet au contrôle de réutiliser les conteneurs d'élément existants pour des éléments de données différents, de manière à éviter que les conteneurs d'élément ne soient constamment créés et détruits à mesure que l'utilisateur fait défiler ItemsControl. Vous pouvez choisir d'activer le recyclage de conteneurs en affectant au VirtualizationMode la valeur Recycling.

Le recyclage de conteneurs n'est pas utilisé si l'un des cas suivants se produit :

Lorsque vous recyclez des conteneurs d'élément, il est important de savoir si vous disposez d'informations d'état supplémentaires associées à un conteneur d'élément qui appartient à l'élément. Si tel est le cas, vous devez enregistrer ces informations d'état supplémentaires. Par exemple, vous pouvez avoir un élément contenu dans un contrôle Expander et l'état IsExpanded peut être lié au conteneur de l'élément, et non à l'élément lui-même. Lorsque le conteneur est réutilisé pour un nouvel élément, la valeur actuelle d'IsExpanded est utilisée pour ce nouvel élément. L'ancien élément perd en plus la valeur IsExpanded correcte.

Tout ItemsControl qui prend en charge la virtualisation peut utiliser le recyclage de conteneurs. Pour obtenir un exemple d'activation du recyclage de conteneurs sur un ListBox, consultez Comment : améliorer les performances de défilement d'un contrôle ListBox.

Prise en charge de la virtualisation bidirectionnelle

VirtualizingStackPanel assure la prise en charge intégrée de la virtualisation de l'interface utilisateur dans un sens, soit horizontalement soit verticalement. Pour utiliser la virtualisation bidirectionnelle pour vos contrôles, vous devez implémenter un panneau personnalisé qui étend la classe VirtualizingStackPanel. La classe VirtualizingStackPanel expose des méthodes virtuelles, telles que OnViewportSizeChanged, LineUp, PageUp et MouseWheelUp. Ces méthodes virtuelles vous permettent de détecter une modification dans la partie visible d'une liste et de la gérer en conséquence.

Optimisation des modèles

L'arborescence d'éléments visuels contient tous les éléments visuels d'une application. Elle contient non seulement les objets directement créés, mais aussi les objets résultant d'une expansion de modèle. Par exemple, lorsque vous créez un Button, vous obtenez également des objets ClassicBorderDecorator et ContentPresenter dans l'arborescence d'éléments visuels. Si vous n'avez pas optimisé vos modèles de contrôle, vous pouvez créer de nombreux objets supplémentaires inutiles dans l'arborescence d'éléments visuels. Vous pouvez utiliser XAMLPad pour assurer le suivi des éléments dans l'arborescence d'éléments visuels et supprimer les éléments inutiles des modèles chaque fois que cela est possible. Pour plus d'informations sur l'arborescence d'éléments visuels, consultez Vue d'ensemble du rendu graphique de Windows Presentation Foundation.

Défilement différé

Par défaut, lorsque l'utilisateur fait glisser le curseur d'une barre de défilement, l'affichage du contenu est mis à jour en permanence. Si le défilement est lent dans votre contrôle, envisagez d'utiliser le défilement différé. Le contenu est alors uniquement mis à jour lorsque l'utilisateur arrête de faire glisser le curseur.

Pour implémenter le défilement différé, affectez à la propriété IsDeferredScrollingEnabled la valeur true. IsDeferredScrollingEnabled est une propriété jointe à laquelle peut être affecté ScrollViewer et tout contrôle qui possède un ScrollViewer dans son modèle de contrôle.

Contrôles implémentant des fonctionnalités de performances

Le tableau suivant répertorie les contrôles communs d'affichage de données et leur prise en charge de fonctionnalités de performances. Pour plus d'informations sur l'activation de ces fonctionnalités, consultez les sections précédentes.

Contrôle

Virtualisation

Recyclage de conteneurs

Défilement différé

ComboBox

Peut être activé

Peut être activé

Peut être activé

ContextMenu

Peut être activé

Peut être activé

Peut être activé

DocumentViewer

Non disponible

Non disponible

Peut être activé

ListBox

Default

Peut être activé

Peut être activé

ListView

Default

Peut être activé

Peut être activé

TreeView

Peut être activé

Peut être activé

Peut être activé

ToolBar

Non disponible

Non disponible

Peut être activé

Remarque :

Pour obtenir un exemple d'activation de la virtualisation et du recyclage de conteneurs sur un TreeView, consultez Comment : améliorer les performances d'un contrôle TreeView.

Voir aussi

Concepts

Système de disposition

Optimisation des performances : disposition et conception

Optimisation des performances : liaison de données

Vue d'ensemble des contrôles

Application d'un style et création de modèles

Historique des modifications

Date

Historique

Raison

Juillet 2008

Ajout d'une rubrique pour .NET Framework 3.5 Service Pack 1.

Modifications de fonctionnalités dans le SP1.