如何在Expression Blend中更改不同状态按钮的文本颜色?

时间:2013-07-09 09:10:48

标签: wpf user-interface expression-blend blend

我还在学习Blend,所以请耐心等待。我在WPF项目中有一个切换按钮,我需要更改不同状态的文本颜色,如mouseover和checked。但是,当我编辑模板并选择contentPresenter时,唯一的画笔是OpacityMask,它不受任何画笔颜色变化的影响。

我当然可以通过编辑样式来更改文本颜色,但这没有用,因为它在编辑中我感兴趣的状态。

基本上,我只是想在鼠标悬停,悬停等方面改变按钮的文本,这似乎是合理的事情,但是无法编辑ContentPresenter的OpacityMask画笔。

有人提到将ContentPresenter更改为ContentControl。这确实有效,但我现在无法编辑按钮实例的文本。我是否必须将ContentControl链接到某些内容?

非常感谢您的帮助。我被困在这里几个小时,我一直在寻找答案,但无济于事

2 个答案:

答案 0 :(得分:1)

前景属性出现在Style中。因此,您可以编辑样式,然后可以设置Foreground。它可能是这样的

<Style.Triggers>
    <Trigger Property="IsChecked" Value="False">
        <Setter Property="Foreground" Value="Blue"/>
    </Trigger>
</Style.Triggers>

或者,如果您想在ControlTemplate中更改它,那么您可以这样做。

<Trigger Property="IsChecked" Value="True">
   <Setter Property="TextBlock.Foreground" TargetName="contentPresenterName" Value="White"/>
</Trigger>

所以在表达式混合中你就像这样做

  1. 资源面板中找到您的样式,然后点击资源旁边的修改资源按钮。或者右键单击并选择编辑
  2. 触发器面板中添加触发器。
  3. 转到属性面板并更改Foreground属性。

答案 1 :(得分:1)

您无需使用ContentControl并只使用VisualStateManager

即可完成您的搜索工作
  

我当然可以通过编辑样式来更改文本颜色,但这没有用,因为它在编辑中我感兴趣的状态。

所以说例如,将Foreground颜色应用于Button的文字的状态为MouseOver

  • 首先,在编辑Brush模板时,Blend不会为Button.MouseOver.Foreground创建Button资源。

所以让我们创建一个。 (只需添加以下行以及其他画笔资源)

<SolidColorBrush x:Key="Button.MouseOver.Foreground" Color="Tomato" />
  • 现在,我们可以将Storyboard应用于TextElement.Foreground的{​​{1}}。

所以你的VSM看起来像:

contentPresenter

就是这样。

请注意,当<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> 的{​​{1}}只是文字时,我们在这里做的只会 ,但是因为这就是你在你的问题,你应该没事。

<强>旁注:

只需将Content切换为Button中的ContentPresenter即可完成相同的操作。

如果TextBlock ControlTemplate的任何Foreground需要Content,那么您只需将Button切换为ContentPresenter即可仍然是你的VSM故事板以非常相似的方式。

<强>更新

要将ContentControl切换为ContentPresenter,请在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}"隐式设置ContentPresenter属性。