Héritage de la valeur de propriété

L’héritage des valeurs de propriété est une fonctionnalité du système de propriétés Windows Presentation Foundation (WPF). L’héritage de la valeur de propriété permet aux éléments enfants d’une arborescence d’éléments d’obtenir la valeur d’une propriété particulière des éléments parents, en héritant cette valeur telle qu’elle a été définie dans l’élément parent le plus proche. L’élément parent peut également avoir obtenu sa valeur par héritage de la valeur de propriété, le système peut donc remonter jusqu’à la racine de la page. L’héritage de la valeur de propriété n’est pas le comportement du système de propriétés par défaut. Une propriété doit être établie avec un paramètre de métadonnées particulier pour pouvoir lancer l’héritage de la valeur de propriété sur les éléments enfants.

L’héritage de la valeur de propriété est un héritage de relation contenant-contenu

Le terme « Héritage » ne désigne pas tout à fait le même concept que l’héritage dans le contexte des types et de la programmation générale orientée objet, où les classes dérivées héritent des définitions de membre de leurs classes de base. Cette signification de l’héritage est également active dans WPF : les propriétés définies dans différentes classes de base sont exposées en tant qu’attributs pour les classes XAML dérivées lorsqu’elles sont utilisées en tant qu’éléments et exposées en tant que membres pour le code. L’héritage de la valeur de propriété concerne particulièrement la façon dont les valeurs de propriété peuvent hériter d’un élément à l’autre en fonction des relations parent-enfant dans une arborescence d’éléments. Cette arborescence d’éléments est la plus directement visible lors de l’imbrication d’éléments à l’intérieur d’autres éléments lorsque vous définissez des applications dans le balisage XAML. Les arborescences d’objets peuvent également être créées par programmation en ajoutant des objets aux collections désignées d’autres objets, et l’héritage de la valeur de propriété fonctionne de la même façon dans l’arborescence terminée au moment de l’exécution.

Applications pratiques de l’héritage de la valeur de propriété

Les API WPF incluent plusieurs propriétés dont l’héritage des propriétés est activé. En règle générale, il s’agit d’une propriété définie une seule fois par page, mais quand elle est également membre d’une des classes d’élément de base, elle existe aussi sur la plupart des éléments enfants. Par exemple, les FlowDirection contrôles de propriété qui indiquent le contenu en flux doivent être présentés et organisés sur la page. En règle générale, vous voulez que le flux de texte soit traité de manière cohérente dans l’ensemble des éléments enfants. Si la direction du flux est redéfinie à un certain niveau de l’arborescence d’éléments par l’utilisateur ou une action de l’environnement, elle est redéfinie partout. Lorsque la FlowDirection propriété est faite pour hériter, la valeur doit être définie ou réinitialisée une seule fois au niveau de l’arborescence d’éléments qui englobe les besoins de présentation de chaque page de l’application. Même la valeur par défaut initiale hérite de cette manière. Le modèle d’héritage de la valeur de propriété permet toujours aux éléments individuels de redéfinir la valeur dans les rares cas où un mélange de directions de flux est intentionnel.

Transformer une propriété personnalisée en propriété héritable

En changeant les métadonnées d’une propriété personnalisée, vous pouvez rendre héritables vos propres propriétés personnalisées. Toutefois, notez qu’une propriété désignée comme héritable a un impact sur les performances. Dans les cas où cette propriété n’a pas de valeur locale établie ou a une valeur obtenue par le biais de styles, de modèles ou d’une liaison de données, une propriété héritable transmet ses valeurs de propriété à 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é jointe, comme décrit dans Enregistrer une propriété jointe. Inscrivez la propriété avec des métadonnées (FrameworkPropertyMetadata) et spécifiez l’option « Hérite » dans les paramètres d’options de ces métadonnées. Vérifiez aussi que la propriété a une valeur par défaut établie, car cette valeur hérite désormais. Même si vous avez enregistré la propriété comme propriété jointe, vous pouvez aussi créer un « wrapper » de propriété pour un avoir accès get/set sur le type de propriétaire, comme pour les propriétés de dépendance « non jointes ». Après cela, la propriété héritée peut être définie à l’aide du wrapper de propriété direct sur le type propriétaire ou les types dérivés, ou elle peut être définie à l’aide de la syntaxe de propriété jointe sur n’importe quel DependencyObject.

Les propriétés jointes sont conceptuellement similaires aux propriétés globales ; vous pouvez case activée pour la valeur sur n’importe quel DependencyObject résultat valide. Le scénario classique pour les propriétés jointes consiste à définir des valeurs de propriété sur les éléments enfants, et ce scénario est plus efficace si la propriété en question est une propriété jointe qui est toujours implicitement présente en tant que propriété jointe sur chaque élément (DependencyObject) dans l’arborescence.

Remarque

Même si l’héritage de la valeur de propriété peut sembler fonctionner pour les propriétés de dépendance non jointes, le comportement de l’héritage d’une propriété non jointe au-delà de certaines limites d’éléments dans l’arborescence d’exécution n’est pas défini. Utilisez RegisterAttached toujours pour inscrire les propriétés dans lesquelles vous spécifiez Inherits 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 sur une arborescence d’éléments. Cette arborescence est souvent parallèle à l’arborescence logique. Toutefois, chaque fois que vous incluez un objet de niveau principal WPF dans le balisage qui définit une arborescence d’éléments, par exemple, Brushvous avez créé une arborescence logique discontinue. Une arborescence logique vraie ne s’étend pas conceptuellement par le biais de l’arborescence Brushlogique, car l’arborescence logique est un concept de niveau framework WPF. Vous pouvez voir cela reflété dans les résultats lors de l’utilisation des méthodes de LogicalTreeHelper. Toutefois, l’héritage de la valeur de propriété peut combler cet écart dans l’arborescence logique et peut toujours transmettre des valeurs héritées, tant que la propriété héritée a été inscrite en tant que propriété jointe et qu’aucune limite de blocage d’héritage délibérée (par exemple) Framen’est rencontrée.

Voir aussi