Share via


Arborescences dans WPF

Mise à jour : novembre 2007

Dans de nombreuses technologies, les éléments et les composants sont organisés dans une arborescence dans laquelle les développeurs manipulent directement l'arborescence pour affecter le rendu d'une application. Windows Presentation Foundation (WPF) utilise également plusieurs métaphores d'arborescence pour définir les relations entre les éléments de programme.

Cette rubrique comprend les sections suivantes.

  • Arborescences dans WPF
  • L'arborescence logique
  • L'arborescence visuelle
  • Arborescences, éléments de contenu et hôtes de contenu
  • Parcours d'une arborescence
  • Routes des événements routés sous la forme d'une "arborescence"
  • Ressources et arborescences
  • Rubriques connexes

Arborescences dans WPF

L'arborescence principale dans WPF est l'arborescence d'éléments. Si vous créez une page application en XAML, l'arborescence est créée selon les relations d'imbrication des éléments dans la balise. Si vous créez une application dans le code, la structure arborescente est créée en suite en fonction de la manière dont vous affectez les valeurs des propriétés qui implémentent le modèle de contenu d'un élément. Dans Windows Presentation Foundation (WPF), il existe deux manières pour traiter et conceptualiser l'arborescence d'éléments : en tant qu'arborescence logique et en tant qu'arborescence visuelle. Les distinctions entre arborescence logique et arborescence visuelle ne sont pas toujours nécessairement importantes, mais elles peuvent générer parfois des problèmes avec certains sous-systèmes WPF et affecter vos choix en terme de balisage ou de code.

Bien que vous ne manipuliez pas toujours directement l'arborescence logique ou l'arborescence d'éléments visuels, la compréhension des concepts d'interaction des arborescences permet de comprendre le fonctionnement de l'héritage de propriété et le routage d'événement dans WPF.

L'arborescence logique

Dans WPF, vous ajoutez le contenu aux éléments à l'aide de propriétés. Par exemple, vous ajoutez des éléments à un contrôle ListBox en utilisant sa propriété Items. Ainsi, vous placez des éléments dans la ItemCollection du contrôle ListBox. Pour ajouter des éléments à un DockPanel, utilisez sa propriété Children. Ici, vous ajoutez des éléments à la UIElementCollection du DockPanel. Pour obtenir un exemple de code, consultez Comment : ajouter dynamiquement un élément.

En XAML (Extensible Application Markup Language), lorsque vous placez des éléments de liste dans une ListBox ou des contrôles ou d'autres éléments dans un DockPanel, vous utilisez également les propriétés Items et Children, soit explicitement soit implicitement, comme dans l'exemple suivant.

<DockPanel
  Name="ParentElement"
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
  >

  <!--implicit: <DockPanel.Children>-->
  <ListBox DockPanel.Dock="Top">
    <!--implicit: <ListBox.Items>-->
    <ListItem>
      <Paragraph>Dog</Paragraph>
    </ListItem>
    <ListItem>
      <Paragraph>Cat</Paragraph>
    </ListItem>
    <ListItem>
      <Paragraph>Fish</Paragraph>
    </ListItem>
    <!--implicit: </ListBox.Items>-->
  </ListBox>
  <Button Height="20" Width="100" DockPanel.Dock="Top">Buy a Pet</Button>

  <!--implicit: </DockPanel.Children>-->
</DockPanel>

Notez que les balises d'élément de propriété ne sont pas exigées explicitement, car le lecteur XAML déduit les éléments de propriété lorsqu'il crée les objets qui créent la représentation de l'objet runtime de l'exécutable de l'application. Pour plus d'informations sur l'association de la syntaxe XAML à l'arborescence logique créée et aux balises déduites, consultez Terminologie de la syntaxe XAML ou Vue d'ensemble du langage XAML. Le graphique suivant fournit une vue conceptuelle de l'arborescence logique construite au moment de l'exécution (la branche du bouton est omise dans le graphique).

Schéma de l'apparence de l'arborescence logique générique

Diagramme de l'arborescence

Fonction de l'arborescence logique

L'arborescence logique permet aux modèles de contenu d'itérer aisément sur leurs éléments enfants possibles et de rendre les modèles de contenu extensibles. En outre, l'arborescence logique fournit une infrastructure pour certaines notifications, comme dans le cas où tous les éléments de l'arborescence logique sont chargés.

De plus, les références de ressource sont résolues en remontant l'arborescence logique pour rechercher les collections Resources dans l'élément demandeur initial, puis dans les éléments parents. L'arborescence logique est utilisée pour rechercher des ressources lorsque l'arborescence logique et l'arborescence visuelle sont présentes. Pour plus d'informations sur les ressources, consultez Vue d'ensemble des ressources.

Remplacement de l'arborescence logique

Les auteurs de contrôle avancés peuvent remplacer l'arborescence logique en remplaçant des API qui définissent la manière dont un objet général ou un modèle de contenu ajoute ou supprime des éléments dans l'arborescence logique. Pour un exemple de remplacement de l'arborescence logique, consultez Comment : remplacer l'arborescence logique.

Héritage de la valeur de propriété

L'héritage de valeur de propriété fonctionne à travers une arborescence hybride. Les métadonnées qui contiennent la propriété Inherits qui active l'héritage de propriété sont la classe au niveau d'infrastructure WPF T:System.Windows.FrameworkPropertyMetadata. Par conséquent, le parent qui contient la valeur d'origine et l'élément enfant qui hérite doivent correspondre tous les deux à l'FrameworkElement ou l'FrameworkContentElement, et ces deux éléments doivent faire partie d'une arborescence logique. Toutefois, l'arborescence logique de parent par rapport à l'enfant peut -être disjointe, l'héritage de valeur de propriété devant pouvoir se perpétuer via un élément visuel intermédiaire qui ne se trouve pas dans une arborescence logique. Pour que l'héritage de valeur de propriété fonctionne de manière cohérente dans une telle limite, la propriété héritière doit être inscrite sous la forme d'une propriété attachée. L'arborescence exacte utilisée pour l'héritage de propriété ne peut pas être entièrement anticipée par une méthode d'utilitaire de classe d'assistance, même au moment de l'exécution. Pour plus d'informations, consultez Héritage de la valeur de propriété.

L'arborescence visuelle

Outre le concept de l'arborescence logique, il existe le concept d'arborescence visuelle dans WPF. L'arborescence visuelle décrit la structure des éléments visuels représentés par la classe de base Visual. Lorsque vous écrivez un modèle pour un contrôle, vous définissez ou redéfinissez l'arborescence visuelle qui s'applique à ce contrôle. L'arborescence visuelle offre également un intérêt pour les développeurs qui veulent disposer d'un contrôle de niveau inférieur pour améliorer les performances et garantir l'optimisation. Un problème lié à l'arborescence visuelle dans le cadre de la programmation d'application WPF classique réside dans le fait que les routes d'un événement passent principalement par l'arborescence visuelle et non pas par l'arborescence logique. Cette subtilité de comportement d'événement routé peut ne pas être immédiatement évidente si vous n'êtes pas auteur de contrôle. Le routage via l'arborescence visuelle permet aux contrôles qu'implémentent la composition au niveau visuel de gérer les événements ou de créer des accesseurs Set d'événement.

Arborescences, éléments de contenu et hôtes de contenu

Les éléments de contenu (classes qui dérivent de ContentElement) ne font pas partie de l'arborescence visuelle ; ils n'héritent pas de Visual et n'ont pas de représentation visuelle. Pour apparaître dans une interface utilisateur, un ContentElement doit être hébergé dans un hôte de contenu qui est à la fois un Visual et un élément d'arborescence logique, généralement un FrameworkElement. Vous pouvez considérer que l'hôte de contenu ressemble à "navigateur" pour le contenu et choisit le mode d'affichage du contenu dans la zone d'écran que l'hôte contrôle. Lorsque le contenu est hébergé, il peut devenir un participant dans les certains processus d'arborescence associés normalement à l'arborescence visuelle. En général, la classe hôte FrameworkElement inclut le code d'implémentation qui ajoute tout ContentElement hébergé à la route d'événement via des sous-nœuds de l'arborescence logique de contenu bien que le contenu hébergé ne fasse pas partie de l'arborescence visuelle logique réelle. Vous devez procéder ainsi pour qu'une ContentElement puisse fournir la source d'un événement routé qui route vers tout autre élément que lui-même.

Parcours d'une arborescence

La classe LogicalTreeHelper fournit les méthodes GetChildren, GetParent et FindLogicalNode pour parcourir l'arborescence logique. Dans la plupart des cas, vous n'avez pas à parcourir l'arborescence logique des contrôles existants, parce que ces contrôles exposent presque toujours leurs éléments enfants logiques sous la forme d'une propriété de collection dédiée qui prend en charge la collection API (Add, un indexeur, etc.). Le parcours d'arborescence est principalement un scénario utilisé par les auteurs de contrôle qui choisissent de ne pas dériver depuis des modèles de contrôle prévus, tels que ItemsControl ou Panel où les propriétés de collection sont déjà définies, et qui veulent fournir leur propre support de propriété de collection.

L'arborescence visuelle prend en charge également une classe d'assistance pour le parcours d'arborescence visuelle, VisualTreeHelper. L'arborescence visuelle n'est pas exposée aussi aisément via des propriétés de contrôle. Par conséquent, la classe VisualTreeHelper est la méthode recommandée pour parcourir l'arborescence visuelle si cela est nécessaire dans votre scénario de programmation. Pour plus d'informations, consultez Vue d'ensemble du rendu graphique de Windows Presentation Foundation.

Routes des événements routés sous la forme d'une "arborescence"

Comme indiqué précédemment, un événement passe par une arborescence en parcourant celle-ci vers le haut ou vers le bas selon qu'il s'agit d'un événement routé par tunneling ou d'un événement routé par propagation. Le concept de routage d'événement ne dispose pas d'une classe d'assistance directe qui pourrait être utilisée pour "parcourir" l'itinéraire d'événement indépendant du déclenchement d'un événement qui assure lui-même le routage. Il existe une classe qui représente la route, EventRoute, mais les méthodes de cette classe sont destinées généralement à une utilisation interne uniquement.

Ressources et arborescences

La recherche de ressource parcourt fondamentalement l'arborescence logique. Les objets qui ne se trouvent pas dans l'arborescence logique peuvent faire référence à des ressources, mais la recherche commence au point à partir duquel l'objet est connecté à l'arborescence logique. Seuls les nœuds d'arborescence logique peuvent avoir une propriété Resources qui contient un ResourceDictionary ; par conséquent parcourir l'arborescence visuelle pour rechercher des ressources n'offre aucun avantage.

Toutefois, la recherche de ressources peut également s'étendre au delà de l'arborescence logique immédiate. Pour le balisage d'application, la recherche de ressources peut s'étendre aux ressources d'application et au support de thème et aux valeurs système. Les thèmes eux-mêmes peuvent également fait référence à des valeurs système en dehors de l'arborescence logique des thèmes si les références de ressources sont dynamiques. Pour plus d'informations sur les ressources et la logique de recherche, consultez Vue d'ensemble des ressources.

Voir aussi

Concepts

Vue d'ensemble des entrées

Vue d'ensemble du rendu graphique de Windows Presentation Foundation

Vue d'ensemble des événements routés

Initialisation d'éléments objets ne figurant pas dans une arborescence d'éléments

Architecture de WPF