Comment exactement les Propriétés Attachées travail dans WPF?
Je suis un peu perplexe quant à la façon dont les Propriétés Attachées réellement transmettre leurs valeurs à la société mère ou à l'enfant-éléments. TextElement.FontFamily
causes les éléments enfants d'hériter de la valeur affectée à la propriété (apparemment en aval de l'opération, de parent à enfant). Grid.Column
provoque un élément parent pour afficher l'enfant dans une position particulière (apparemment en amont de l'opération, de l'enfant, le parent). Comment puis-valeurs de la Propriété Attachée savoir soit à débit vers le haut ou vers le bas? Est ma conception de cette erreur, ou est-il un élément manquant qui va mettre tout cela en perspective?
<StackPanel TextElement.FontFamily="Wingdings">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Button Grid.Column="1" Content="My Button"/>
</Grid>
</StackPanel>
Vous devez vous connecter pour publier un commentaire.
Il y a deux concepts ici: les propriétés de dépendance et attachées des propriétés de dépendance. "Attaché" Propriétés sont des propriétés de dépendance, et en tant que telle la dépendance au soutien la valeur de la propriété de l'héritage.
Sur base des propriétés de dépendance, un très approximative déclaration serait qu'en fait, ils héritent de leurs valeurs d'éléments parent dans le wpf (logique/visuel) de l'arbre. Une propriété de dépendance (connecté ou pas) hérite de sa valeur "vers le bas", si son les métadonnées est réglé avec le FrameworkPropertyMetadataOptions.Hériter drapeau, et dans de nombreux cas, c'est ainsi.
Attaché propriétés sont des propriétés qui peuvent être réglés sur n'importe quel objet wpf (en gros, au moins un DependencyObject) via le DependencyObject.SetValue méthode. Le but de ce mécanisme est "d'attacher" à d'autres objets de l'information requise par les objets parents, pas à l'enfant des objets eux-mêmes. Par exemple, le De la grille.Ligne est une propriété attachée requis par la Grille pour placer les éléments à l'intérieur de sa zone de rendu.
Les propriétés de dépendance sont hérités "vers le bas" automatiquement par le wpf objet système.
Propriétés attachées sont examinés "vers le haut", explicitement, dans le code des objets spécifiques. Dans le cas de la Grille, au moment de choisir l'emplacement de ses éléments, il vérifie la valeur de la Grille.Ligne et de la Grille.Colonne de propriétés associées à chaque élément contenu.
C'est aussi souvent la technique pour créer des propriétés attachées de modifier de quelque façon les objets qu'ils y sont attachés (par exemple, la Drag'n'Drop fonctionnalité via les propriétés jointes).
Comme une note complémentaire, un bon exemple d'hériter de la propriété attachée est TextElement.FontFamily. De la grille.Ligne et de la Grille.Les propriétés de la colonne n'ont pas l'Hérite de drapeau.
TextElement.FontFamily, à partir de Réflecteur:
De la grille.Ligne, à partir de Réflecteur:
De MSDN:
Bien que les propriétés jointes sont réglables sur n'importe quel objet, qui ne signifie pas automatiquement que la définition de la propriété va produire un résultat tangible, ou que la valeur ne sera jamais utilisé par un autre objet. Généralement, les propriétés jointes sont conçus de sorte que les objets provenant de diverses hiérarchies de classes possibles ou logique, les relations de chaque rapport d'information commune pour le type qui définit la propriété attachée. Le type qui définit la propriété attachée suit en général l'un de ces modèles:
Le type qui définit le joint
la propriété est conçu de sorte qu'il peut
être le parent de l'élément des éléments
qui permettra de définir des valeurs pour le joint
de la propriété. Le type d'itération de son
les objets enfants par le biais de la logique interne
à l'encontre de certains objets de l'arborescence de la structure,
obtient les valeurs et les actes sur ceux
les valeurs d'une certaine manière.
Le type qui définit le joint
la propriété sera utilisée comme l'enfant
élément pour une variété de possibles
les éléments parents et les modèles de contenu.
Le type qui définit le joint
la propriété représente un service. D'autres
types de définir des valeurs pour le joint
de la propriété. Puis, lorsque l'élément qui
définir la propriété est évaluée dans le
contexte du service, le joint
les valeurs de propriété sont obtenus par le biais de
la logique interne de la classe de service.
Un Exemple d'un Parent Défini par la Propriété Attachée
Le scénario le plus habituel où WPF définit une propriété attachée, c'est quand un parent de l'élément prend en charge un enfant de l'élément de la collection, et met également en œuvre un comportement où les spécificités du comportement sont signalés individuellement pour chaque élément d'enfant.
DockPanel définit la DockPanel.Quai de la propriété attachée, et DockPanel classe a-niveau de code dans le cadre de sa logique de rendu (plus précisément, MeasureOverride et ArrangeOverride). Un DockPanel instance sera toujours vérifier pour voir si l'un quelconque de ses éléments immédiats d'enfant ont une valeur pour DockPanel.Dock. Dans ce cas, ces valeurs deviennent d'entrée pour le rendu de la logique appliquée à cet élément enfant. Imbriquée DockPanel instances traitent chacun leur propre enfant immédiat collections d'élément, mais ce comportement est spécifique à l'implémentation de la façon dont DockPanel processus DockPanel.Quai des valeurs. Il est théoriquement possible d'avoir des propriétés attachées que l'influence des éléments au-delà du parent immédiat. Si le DockPanel.Dock attaché propriété est définie sur un élément qui n'a pas de parent DockPanel élément d'agir sur elle, pas d'erreur ou exception est levée. Cela signifie simplement que d'une propriété globale de la valeur a été fixée, mais il n'a actuellement pas de parent DockPanel qui risque de consommer de l'information.
Dans des mots simples, c'est la façon dont je le comprends (corrigez-moi si je me trompe).
Un objet (A) met en œuvre une propriété qui s'attache à un autre objet (B) (objet B n'a même pas connaître l'existence de cet "accrochage" de la propriété). L'objet B doit hériter de DependencyObject.
Objet d'Un met également en œuvre une méthode statique pour vérifier que c'est "l'accrochage" de la propriété dans d'autres objets, A. GetAttachedProperty(B).
Si B a la propriété attachée de A, A. GetAttachedProperty vont le lire et de le retourner de valeur. Sinon Un va essayer de le lire, et de retourner la valeur null car il n'est pas là.