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 présente des techniques destinées à améliorer les performances de votre interface utilisateur.
Affichage de jeux de données volumineux
Les contrôles WPF tels que le ListView et ComboBox sont utilisés pour afficher des listes d’éléments dans une application. Si la liste à afficher est longue, les performances de l’application risquent de s’en être 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 besoin d’afficher tous les éléments en même temps ; il suffit en effet de n’en afficher qu’une partie et l’utilisateur parcourt la liste. Dans ce cas, il est judicieux d’utiliser la virtualisation de l’interface utilisateur : la génération du conteneur d’élément et le calcul de disposition associé d’un élément sont alors 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. Il ne faut pas confondre la virtualisation de l’interface utilisateur et la virtualisation des données. La virtualisation de l’interface utilisateur ne stocke en mémoire que les éléments visibles, mais dans un scénario de liaison de données, elle stocke en mémoire l’ensemble de la structure de données. En revanche, dans le cas de la virtualisation des données, seuls sont stockées en mémoire les éléments de données qui sont visibles à l’écran.
Par défaut, la virtualisation de l’interface utilisateur est activée pour les ListView contrôles et ListBox les contrôles lorsque leurs éléments de liste sont liés aux données. TreeView la virtualisation peut être activée en définissant la VirtualizingStackPanel.IsVirtualizing propriété jointe sur true
. Si vous souhaitez activer la virtualisation de l’interface utilisateur pour les contrôles personnalisés qui dérivent ou ItemsControl des contrôles d’élément existants qui utilisent la StackPanel classe, par ComboBoxexemple, vous pouvez définir la valeur et VirtualizingStackPanel la ItemsPanel définir IsVirtualizingtrue
sur . Vous risquez malheureusement de désactiver la virtualisation de l’interface utilisateur pour ces contrôles sans vous en rendre compte. Voici la liste des situations qui entraînent la désactivation de la virtualisation de l’interface utilisateur :
Les conteneurs d’éléments sont ajoutés directement au ItemsControl. Par exemple, si une application ajoute ListBoxItem explicitement des objets à un ListBox, elle ListBox ne virtualise pas les ListBoxItem objets.
Les conteneurs d’éléments dans le ItemsControl sont de différents types. Par exemple, un Menu objet qui utilise Separator des objets ne peut pas implémenter le recyclage des éléments, car il Menu contient des objets de type Separator et MenuItem.
Définissant CanContentScroll sur
false
.Définissant IsVirtualizing sur
false
.
Au moment de virtualiser des conteneurs d’éléments, il est important de déterminer si des informations d’état supplémentaire sont associées à un conteneur d’élément qui appartient à l’élément. Si tel est le cas, vous devez enregistrer l’état supplémentaire. Par exemple, vous pouvez avoir un élément contenu dans un Expander contrôle 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 est IsExpanded utilisée pour le nouvel élément. En outre, l’ancien élément perd la valeur correcte IsExpanded .
Actuellement, aucun contrôle WPF n’offre une prise en charge intégrée de la virtualisation des données.
Recyclage de 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 est ItemsControlle recyclage des conteneurs, ce qui peut également améliorer les performances de défilement. Lorsqu’une ItemsControl virtualisation de l’interface utilisateur est remplie, elle crée un conteneur d’éléments pour chaque élément qui fait défiler l’affichage et détruit le conteneur d’éléments pour chaque élément qui fait défiler l’affichage. Le recyclage des conteneurs permet au contrôle de réutiliser les conteneurs d’éléments existants pour différents éléments de données, afin que les conteneurs d’éléments ne soient pas créés et détruits en permanence lorsque l’utilisateur défile le ItemsControl. Vous pouvez choisir d’activer le recyclage des éléments en définissant la VirtualizationMode propriété jointe sur Recycling.
Tout ItemsControl ce qui prend en charge la virtualisation peut utiliser le recyclage des conteneurs. Pour obtenir un exemple d’activation du recyclage des conteneurs sur un ListBoxconteneur, 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 VirtualizingStackPanel classe. La VirtualizingStackPanel classe expose des méthodes virtuelles telles que OnViewportSizeChanged, , LineUpPageUp, 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 et ContentPresenter des ClassicBorderDecorator objets dans l’arborescence visuelle. Si vous n’avez pas optimisé vos modèles de contrôle, vous risquez de créer de nombreux objets superflus dans l’arborescence visuelle. Pour plus d’informations sur l’arborescence d’éléments visuels, consultez Vue d’ensemble du rendu graphique de WPF.
Défilement différé
Par défaut, quand 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 n’est alors mis à jour qu’à partir du moment où l’utilisateur arrête de faire glisser le curseur.
Pour implémenter le défilement différé, définissez la IsDeferredScrollingEnabled propriété sur true
. IsDeferredScrollingEnabled est une propriété jointe et peut être définie sur ScrollViewer et n’importe quel contrôle qui a un ScrollViewer modèle de contrôle.
Contrôles qui implémentent des fonctionnalités de performances
Le tableau suivant répertorie les contrôles communs d’affichage de 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ôler | Virtualization | 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 | Valeur par défaut | Peut être activé | Peut être activé |
ListView | Valeur 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 d’activation de la virtualisation et du recyclage des conteneurs sur un TreeViewobjet , consultez Améliorer les performances d’un TreeView.
Voir aussi
.NET Desktop feedback
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour