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.
Les conteneurs d'élément sont directement ajoutés à ItemsControl. Par exemple, si une application ajoute explicitement des objets ListBoxItem à un ListBox, ListBox ne virtualise pas les objets ListBoxItem. Pour plus d'informations sur les conteneurs d'élément, consultez la section « ItemsControl » dans Vue d'ensemble du modèle de contenu des contrôles.
Affectation à CanContentScroll de la valeur false.
Affectation à IsVirtualizing de la valeur false.
Utilisation d'un regroupement d'éléments.
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 :
Les conteneurs d'élément sont directement ajoutés à ItemsControl. Par exemple, les objets ListBoxItem sont directement ajoutés à un contrôle ListBox. Pour plus d'informations sur les conteneurs d'élément, consultez la section « ItemsControl » dans Vue d'ensemble du modèle de contenu des contrôles.
Les conteneurs d'élément figurant dans ItemsControl sont de types différents. Par exemple, un Menu qui utilise des objets Separator ne peut pas implémenter le recyclage de conteneurs, car Menu contient des objets de type Separator et MenuItem.
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é |
---|---|---|---|
Peut être activé |
Peut être activé |
Peut être activé |
|
Peut être activé |
Peut être activé |
Peut être activé |
|
Non disponible |
Non disponible |
Peut être activé |
|
Default |
Peut être activé |
Peut être activé |
|
Default |
Peut être activé |
Peut être activé |
|
Peut être activé |
Peut être activé |
Peut être activé |
|
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
Optimisation des performances : disposition et conception
Optimisation des performances : liaison de données
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. |