Utilisation de Silverlight 4 & WPF 4, j'essaie de créer un style de bouton qui modifie la couleur du texte de tout texte contenu lorsque le bouton est mouseover'd. Depuis que je suis en train de faire ce compatible avec Silverlight & WPF, j'utilise le gestionnaire de l'état visuel:Dans le modèle de contrôle d'un bouton, comment puis-je définir la couleur du texte contenu?
<Style TargetType="{x:Type Button}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border x:Name="outerBorder" CornerRadius="4" BorderThickness="1" BorderBrush="#FF757679">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="MouseOver">
<Storyboard>
<ColorAnimation Duration="0" To="#FFFEFEFE"
Storyboard.TargetProperty="(TextElement.Foreground).(SolidColorBrush.Color)"
Storyboard.TargetName="contentPresenter"/>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Grid>
<Border x:Name="Background" CornerRadius="3" BorderThickness="1" BorderBrush="Transparent">
<Grid>
<ContentPresenter x:Name="contentPresenter" ContentTemplate="{TemplateBinding ContentTemplate}"/>
</Grid>
</Border>
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
Puisque c'est un modèle pour un bouton régulier vieux, je sais qu'il n'y a pas garantir qu'il y a même un bloc de texte à l'intérieur, et au début je n'étais pas sûr que c'était même possible. Curieusement, la couleur du texte ne changement si le bouton est déclarée comme:
<Button Content="Hello, World!" />
mais ne changement si le bouton est déclarée comme:
<Button>
<TextBlock Text="Hello, World!" /> <!-- Same result with <TextBlock>Hello, World </TextBlock> -->
</Button>
Même si l'arbre visuel (quand inspecté dans snoop) est identique (Button -> ContentPresenter -> TextBlock), avec la mise en garde que le bloc de texte créé dans la 1ère version a son contexte de données défini sur "Hello, World", alors que le bloc de texte dans la seconde ensemble de propriétés de texte. Je présume que cela a quelque chose à voir avec l'ordre de création du contrôle (la première version du bouton crée le TextBlock, dans la deuxième version, le bloc de texte peut être créé en premier (vraiment pas sur ce point). Dans le cadre de cette recherche, j'ai vu des solutions qui fonctionnent dans Silverlight (comme le remplacement du ContentPresenter par un ContentControl), mais cela ne fonctionnera pas dans WPF (le programme se bloque réellement). Puisque ceci est dans le modèle de contrôle du bouton, et si je veux utiliser le VSM si possible, je pense que cela exclut également la modification explicite de la propriété Foreground de Button (je ne sais pas comment j'accèderais à partir de dans le modèle?)
J'apprécierais vraiment n'importe quelle aide, conseil que n'importe qui pourrait donner.
Je suis surpris que cela a fonctionné du tout compte tenu que TextElement n'a rien à voir avec TextBlock. – Denis