你可以做你正在寻找的东西,而无需使用 aContentControl
并且只需使用VisualStateManager
我当然可以通过编辑样式来更改文本颜色,但这没有用,因为它在我感兴趣的编辑状态内。
因此,例如将新Foreground
颜色应用于您的文本的状态Button
是MouseOver
,
- 首先,Blend在编辑模板时不会创建
Brush
资源。Button.MouseOver.Foreground
Button
所以让我们创建一个。(只需添加以下行以及其他画笔资源)
<SolidColorBrush x:Key="Button.MouseOver.Foreground" Color="Tomato" />
- 现在我们可以将 a
Storyboard
应用于TextElement.Foreground
.contentPresenter
所以你的 VSM 看起来像:
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal"/>
<VisualState x:Name="MouseOver">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="contentPresenter"
Storyboard.TargetProperty="(TextElement.Foreground)">
<DiscreteObjectKeyFrame KeyTime="0">
<DiscreteObjectKeyFrame.Value>
<SolidColorBrush Color="{Binding Source={StaticResource Button.MouseOver.Foreground}, Path=Color}" />
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="Pressed"/>
<VisualState x:Name="Disabled"/>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
就是这样。
请注意,仅当 的Content
只是文本时,我们在这里所做的事情才可以Button
,但是由于这就是您的问题中提到的用法,因此您应该没问题。
边注:
您只需ContentPresenter
将TextBlock
.ControlTemplate
如果您需要Foreground
可用于任何Content
,Button
那么您只需将 切换ContentPresenter
到 a ContentControl
,您仍然可以以非常相似的方式使用您的 VSM Storyboard。
更新:
要切换ContentPresenter
到 a ContentControl
,ControlTemplate
只需将实际元素切换为新元素即可。
<ControlTemplate TargetType="{x:Type Button}">
...
<ContentPresenter x:Name="contentPresenter" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" RecognizesAccessKey="True"/>
...
</ControlTemplate>
到:
<ControlTemplate TargetType="{x:Type Button}">
...
<ContentControl x:Name="contentPresenter" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Content="{TemplateBinding Content}"/>
...
</ControlTemplate>
您必须相应地更新它们的属性,例如ContentControl
不支持RecognizesAccessKeys
,并且还需要Content="{TemplateBinding Content}"
对其进行设置以实际显示内容。使用 a隐式设置属性ContentPresenter
。Content