WPF se Lier à la propriété parent de l'intérieur élément imbriqué à l'aide de style
J'ai essayé de construire une zone de texte avec un soupçon affichant alors qu'il est vide.
Je vais avoir des problèmes de réglage de l'indicateur du texte à partir d'un style.
Pour être précis, ce œuvres (qui est, il se lie correctement):
<TextBox Tag="hint text">
<TextBox.Background>
<VisualBrush Stretch="None">
<VisualBrush.Visual>
<TextBlock Text="{Binding Tag, RelativeSource={RelativeSource AncestorType=TextBox}}" FontStyle="Italic" Foreground="LightGray" />
</VisualBrush.Visual>
</VisualBrush>
</TextBox.Background>
</TextBox>
mais, quand je le déplacer pour le Style, il n'a pas d':
<Style TargetType="TextBox" x:Key="stlHintbox">
<Style.Triggers>
<DataTrigger Binding="{Binding Text, RelativeSource={RelativeSource Mode=Self}}" Value="">
<Setter Property="Background">
<Setter.Value>
<VisualBrush Stretch="None">
<VisualBrush.Visual>
<TextBlock Tag="inner" Text="{Binding Tag, RelativeSource={RelativeSource AncestorType=TextBox}}"
FontStyle="Italic" Foreground="LightGray" />
</VisualBrush.Visual>
</VisualBrush>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
<TextBox Tag="hint text" Style="{StaticResource stlHintbox}" />
Alors, quel est le piège? Comment puis-je lier à l'ancêtre de la propriété de l'intérieur un style?
OriginalL'auteur veljkoz | 2010-09-03
Vous devez vous connecter pour publier un commentaire.
Le problème n'est pas le RelativeSource mais avec la façon dont vous utilisez le VisualBrush. Rappelons que les Styles sont partagés entre les éléments, de les appliquer. La raison que votre exemple ne fonctionne pas, c'est que, en effet que vous essayez de partager une seule zone de texte (celui que vous avez marqués "intérieure"), avec de multiples parent zones de texte.
À voir pourquoi c'est un problème, essayez une expérience de pensée: l'intérieure de La zone de texte est créé une fois (en gros, ce sera le cas lorsque le style est créé). Qui des zones de texte que le style est appliqué à doit être choisi comme l'ancêtre de l'intérieur de la zone de texte lorsque vous utilisez le RelativeSource de liaison?
C'est pourquoi DataTemplates et ControlTemplates existent dans WPF. Plutôt que de réellement instancier visuels directement, ils définissent un modèle qui permet à de multiples copies des visuels pour être créés en tant que de besoin.
OriginalL'auteur Samuel Jack
Reativesource ne fonctionne pas comme prévu.
Il est préférable de créer un filigrane zone de texte à l'aide de modèle de contrôle. Mais votre version de travail:
OriginalL'auteur vorrtex