3

我在 WPF 中有一个自定义按钮。在禁用状态下,我希望它的内容颜色发生变化,但我无法做到这一点。我正在使用 Blend for Visual Studio。当我去编辑模板并选择 contentPresente 的画笔颜色时,它说该值无效。我怎样才能做到这一点 ?我试图在 XAML 中更改它,这是我使用的代码,但有一个错误。

<ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" Storyboard.TargetName="contentPresenter">
    <EasingColorKeyFrame KeyTime="0" Value="Black" />
</ColorAnimationUsingKeyFrames>
4

2 回答 2

11

ContentPresenter本身没有任何 Visual Style。它只是它所在Content的 the的占位符。ControlStyle

要修改Foreground自定义中Button的,您可以使用带有for的Style.ControlTemplate附加属性TextElement.ForegroundContentPresenterTriggerIsEnabled="False"

...
<ControlTemplate.Triggers>
  ...
  <Trigger Property="IsEnabled"
            Value="False">
    <Setter TargetName="contentPresenter"
            Property="TextElement.Foreground"
            Value="Red" />
  </Trigger>
</ControlTemplate.Triggers>
...

因此,您可以对同一属性执行相同Storyboard的 via 或VisualStateManagervia blend。

笔记:

理解这一点非常重要^^ 我们假设Button使用 thisStyle将其Content作为一些文本。如果您Button.Content的与另一个类似FrameworkElement(例如 a ComboBox),您将不会看到它变成“红色”。

于 2013-06-16T15:47:53.883 回答
1

使用ControlTemplate.Resourcesand为任何元素找到了一种“Hacky”方法TargetType

<ControlTemplate x:Key="GlyphButton" TargetType="{x:Type Button}">
  <ControlTemplate.Resources>
    <Style TargetType="{x:Type fa:ImageAwesome}">
        <Setter Property="Foreground" Value="Gray"/>
        <Style.Triggers>
            <DataTrigger Binding="{Binding IsMouseOver, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}}" Value="true">
                <Setter Property="Foreground" Value="#FF048758"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
  </ControlTemplate.Resources>
  <ContentPresenter/>
</ControlTemplate>

可悲的是,您不能以VisualStateManager这种方式使用按钮。

于 2016-06-23T19:56:19.527 回答