Optimisation des performances : contrôles
Windows Presentation Foundation (WPF) inclut un grand nombre des composants d’interface utilisateur courants utilisés dans la plupart des applications Windows. Cette rubrique contient des techniques permettant d’améliorer les performances de votre interface utilisateur.
Affichage de jeux de données volumineux
Les contrôles WPF tels que les ListView et les ComboBox sont utilisés pour afficher des listes d’éléments dans une application. Si la liste à afficher est volumineuse, les performances de l’application peuvent être affectées. Cela est dû au fait que le système de disposition standard crée un conteneur de disposition pour chaque élément associé au contrôle de liste et calcule sa taille et sa position de disposition. En règle générale, vous n’avez pas besoin d’afficher tous les éléments en même temps ; Au lieu de cela, vous affichez un sous-ensemble et l’utilisateur fait défiler la liste. Dans ce cas, il est judicieux d’utiliser l’interface utilisateur virtualisation, ce qui signifie que la génération du conteneur d’éléments et le calcul de disposition associé pour un élément sont différés jusqu’à ce que l’élément soit visible.
Ui Virtualization 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 en mémoire, mais dans un scénario de liaison de données stocke toute la structure de données en mémoire. En revanche, la virtualisation des données stocke uniquement les éléments de données visibles sur l’écran en 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. TreeView virtualisation peut être activée en définissant la propriété associée VirtualizingStackPanel.IsVirtualizing sur true
. Si vous souhaitez activer la virtualisation de l’interface utilisateur pour les contrôles personnalisés qui dérivent de ItemsControl ou des contrôles d’élément existants qui utilisent la classe StackPanel, comme ComboBox, vous pouvez définir le ItemsPanel sur VirtualizingStackPanel et définir IsVirtualizing sur true
. Malheureusement, vous pouvez désactiver la virtualisation de l’interface utilisateur pour ces contrôles sans le réaliser. Voici une liste de conditions qui désactivent la virtualisation de l’interface utilisateur.
Les conteneurs d’éléments sont ajoutés directement au ItemsControl. Par exemple, si une application ajoute explicitement des objets ListBoxItem à un ListBox, le ListBox ne virtualise pas les objets ListBoxItem.
Les conteneurs d’éléments dans le ItemsControl sont de différents types. Par exemple, un Menu qui utilise des objets Separator ne peut pas implémenter le recyclage des éléments, car le Menu contient des objets de type Separator et MenuItem.
Définition de CanContentScroll à
false
Définition de IsVirtualizing sur
false
.
Une considération importante lorsque vous virtualisez des conteneurs d’éléments est de savoir si vous avez des informations d’état supplémentaires associées à un conteneur d’éléments qui appartient à l’élément. Dans ce cas, vous devez enregistrer l’état supplémentaire. Par exemple, vous pouvez avoir un élément contenu dans un contrôle Expander et que l’état IsExpanded est 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 de IsExpanded est utilisée pour le nouvel élément. En outre, l’ancien élément perd la valeur de IsExpanded correcte.
Actuellement, aucun contrôle WPF n’offre de prise en charge intégrée de la virtualisation des données.
Recyclage des conteneurs
Une optimisation de la virtualisation de l’interface utilisateur ajoutée dans .NET Framework 3.5 SP1 pour les contrôles qui héritent de ItemsControl est recyclage des conteneurs, qui peut également améliorer les performances de défilement. Lorsqu'un ItemsControl qui utilise la virtualisation de l'interface utilisateur est peuplé, il crée un conteneur pour chaque élément qui entre dans le champ de vision et détruit le conteneur pour chaque élément qui en sort. Recyclage de Conteneur permet au contrôle de réutiliser les conteneurs d'éléments existants pour différents éléments de données, afin d'éviter la création et la destruction continues des conteneurs d'éléments lorsque l'utilisateur défile le ItemsControl. Vous pouvez choisir d’activer le recyclage des éléments en définissant la propriété jointe VirtualizationMode sur Recycling.
Toute ItemsControl qui prend en charge la virtualisation peut utiliser le recyclage des conteneurs. Pour un exemple de la façon d'activer le recyclage des conteneurs sur un ListBox, consultez Améliorer les performances de défilement d'un ListBox.
Prise en charge de la virtualisation bidirectionnelle
VirtualizingStackPanel offre une prise en charge intégrée de la virtualisation de l’interface utilisateur dans une direction, horizontalement ou verticalement. Si vous souhaitez 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, PageUpet 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 visuelle contient tous les éléments visuels d’une application. En plus des objets directement créés, il contient également des objets en raison de l’expansion du modèle. Par exemple, lorsque vous créez un Button, vous obtenez également des objets ClassicBorderDecorator et ContentPresenter dans l’arborescence visuelle. Si vous n’avez pas optimisé vos modèles de contrôle, vous créez peut-être beaucoup d’objets inutiles supplémentaires dans l’arborescence visuelle. Pour plus d’informations sur l’arborescence visuelle, consultez Vue d’ensemble du rendu graphique WPF.
Défilement différé
Par défaut, lorsque l’utilisateur fait glisser le pouce sur une barre de défilement, l’affichage de contenu est mis à jour en permanence. Si le défilement est lent dans votre élément de commande, envisagez d’utiliser le défilement différé. Dans le défilement différé, le contenu est mis à jour uniquement lorsque l’utilisateur libère le pouce.
Pour implémenter le défilement différé, définissez la propriété IsDeferredScrollingEnabled sur true
. IsDeferredScrollingEnabled est une propriété jointe et peut être définie sur ScrollViewer et tout contrôle qui a un ScrollViewer dans son modèle de contrôle.
Contrôles qui implémentent des fonctionnalités de performances
Le tableau suivant répertorie les contrôles courants pour l’affichage des données et leur prise en charge des 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 des 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 | Par défaut | Peut être activé | Peut être activé |
ListView | Par défaut | 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 de l'activation de la virtualisation et de la réutilisation des conteneurs sur un TreeView, consultez Améliorer les performances de TreeView.
Voir aussi
- disposition
- disposition et conception
- Liaison de données
- contrôles
- Style et Modélisation
- procédure pas à pas : mise en cache des données d’application dans une application WPF
.NET Desktop feedback