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 IsVirtualizingtruesur . 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 :

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