Héritage de la valeur de propriété

Mise à jour : novembre 2007

L'héritage de valeur de propriété est une fonctionnalité du système de propriétés Windows Presentation Foundation (WPF). L'héritage de valeur de propriété permet aux éléments enfants dans une arborescence d'éléments d'obtenir la valeur d'une propriété particulière auprès d'éléments parents, en héritant cette valeur telle que définie dans l'élément parent le plus proche. L'élément parent pourrait également avoir obtenu sa valeur par héritage de valeur de propriété. Le système effectue donc potentiellement un traitement récursif jusqu'à la racine de page. L'héritage de valeur de propriété n'est pas le comportement par défaut du système de propriétés. Une propriété doit être établie avec un paramètre de métadonnées particulier pour pouvoir initialiser l'héritage de valeur de propriété sur les éléments enfants.

Cette rubrique comprend les sections suivantes.

  • L'héritage de valeur de propriété correspond à l'héritage de contenance
  • Applications pratiques de l'héritage de valeur de propriété
  • Rendre une propriété personnalisée héritable
  • Héritage de valeurs de propriété au-delà des limites d'arborescence
  • Rubriques connexes

L'héritage de valeur de propriété correspond à l'héritage de contenance

Dans ce contexte, l'héritage n'est pas tout à fait le même concept que l'héritage dans le contexte de la programmation générale orientée objet et de type, où les classes dérivées héritent des définitions de membre de leurs classes de base. Cette signification de l'héritage s'applique également dans WPF : les propriétés définies dans différentes classes de base sont exposées comme attributs pour des classes XAML dérivées en cas d'utilisation comme éléments, et sont exposées comme membres pour le code. L'héritage de valeur de propriété concerne plus particulièrement la manière dont les valeurs de propriété peuvent hériter d'un élément à un autre selon les relations parent-enfant dans une arborescence d'éléments. Cette arborescence d'éléments apparaît le plus clairement lors de l'imbrication d'éléments dans d'autres éléments lorsque vous définissez des applications dans le balisage XAML. Vous pouvez également créer des arborescences d'objets par programme en ajoutant des objets aux collections désignées d'autres objets. L'héritage de valeur de propriété fonctionne de la même manière dans l'arborescence finie au moment de l'exécution.

Applications pratiques de l'héritage de valeur de propriété

Les APIWPF incluent plusieurs propriétés pour lesquelles l'héritage des propriétés est activé. Dans le scénario classique, la propriété doit être définie une seule fois par page, mais cette propriété est également membre de l'une des classes d'éléments de base et existe donc également dans la plupart des éléments enfants. Par exemple, la propriété FlowDirection contrôle le sens dans lequel le contenu passé doit être présenté et organisé dans la page. En général, vous souhaitez que le concept de flux de texte soit géré de manière cohérente dans tous les éléments enfants. Si le sens du déroulement a été réinitialisé pour l'une ou l'autre raison dans un niveau de l'arborescence d'éléments par un utilisateur ou par une action d'environnement, il doit être généralement réinitialisé partout. Lorsque la propriété FlowDirection est faite pour hériter, la valeur ne doit être définie ou réinitialisée qu'une seule fois au niveau de l'arborescence d'éléments qui comprend les besoins de présentation de chaque page de l'application. Même la valeur par défaut initiale héritera de cette manière. Le modèle d'héritage de valeur de propriété permet également aux éléments individuels de réinitialiser la valeur dans les rares cas où vous souhaitez réellement avoir plusieurs sens de déroulement.

Rendre une propriété personnalisée héritable

En modifiant les métadonnées d'une propriété personnalisée, vous pouvez également rendre vos propres propriétés personnalisées héritables. Notez toutefois que la désignation d'une propriété comme pouvant être héritée exerce un impact sur les performances. Lorsque cette propriété n'a pas de valeur locale établie ou de valeur obtenue par des styles, des modèles ou une liaison de données, une propriété qui peut être héritée fournit ses valeurs de propriété assignées à tous les éléments enfants dans l'arborescence logique.

Pour qu'une propriété participe à l'héritage de valeur, créez une propriété attachée personnalisée, comme décrit dans Comment : enregistrer une propriété attachée. Enregistrez la propriété avec les métadonnées (FrameworkPropertyMetadata) et spécifiez l'option « Inherits » dans les paramètres d'options de ces métadonnées. Veillez également à ce que la propriété ait une valeur par défaut établie, car cette valeur héritera désormais. Bien que vous ayez enregistré la propriété comme étant attachée, vous pouvez également souhaiter créer un « wrapper » de propriété pour obtenir/définir l'accès sur le type de propriétaire, comme vous le feriez pour une propriété de dépendance « non attachée ». Ensuite, la propriété héritable peut être définie soit en utilisant le wrapper de propriété direct sur le type de propriétaire ou les types dérivés, soit en utilisant la syntaxe de propriété attachée sur tout DependencyObject.

Les propriétés attachées sont conceptuellement semblables aux propriétés globales. Vous pouvez chercher la valeur sur tout DependencyObject et obtenir un résultat valide. Le scénario classique pour les propriétés attachées consiste à définir des valeurs de propriété sur des éléments enfants. Ce scénario est plus efficace si la propriété concernée est une propriété attachée qui est toujours implicitement présente comme propriété attachée sur chaque élément (DependencyObject) dans l'arborescence.

Remarque :

Bien que l'héritage de la valeur de propriété puisse sembler fonctionner pour les propriétés de dépendance non attachées, le comportement d'héritage d'une propriété non attachée par certaines limites d'éléments dans l'arborescence d'exécution n'est pas défini. Utilisez toujours RegisterAttached pour inscrire des propriétés où vous avez spécifié Inherits dans les métadonnées.

Héritage de valeurs de propriété au-delà des limites d'arborescence

L'héritage des propriétés fonctionne en traversant une arborescence d'éléments. Cette arborescence est souvent parallèle à l'arborescence logique. Toutefois, lorsque vous incluez un objet de niveau principal WPF dans le balisage qui définit une arborescence d'éléments (comme un Brush), vous avez créé une arborescence logique discontinue. Une arborescence logique réelle ne s'étend pas conceptuellement au Brush, parce que l'arborescence logique est un concept d'infrastructure WPF. Vous pouvez observer ce phénomène dans les résultats lors de l'utilisation des méthodes de LogicalTreeHelper. Toutefois, l'héritage de valeur de propriété peut rétablir la continuité de l'arborescence logique et peut toujours passer des valeurs héritées, tant que la propriété héritable a été enregistrée comme propriété attachée et qu'aucune limite de blocage d'héritage délibérée (comme Frame) n'est rencontrée.

Voir aussi

Concepts

Métadonnées de propriété de dépendance

Vue d'ensemble des propriétés attachées

Priorité de la valeur de propriété de dépendance