I have a custom button in WPF. On disabled state I want it's content color to change, but I can't manage to do that. I'm using Blend for Visual Studio. When I go to edit template and choose contentPresente's brush color it says that value is invalid. How can I do that ? I tried to change it in XAML and this is the code I used but there is an error.
<ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" Storyboard.TargetName="contentPresenter">
<EasingColorKeyFrame KeyTime="0" Value="Black" />
</ColorAnimationUsingKeyFrames>
ContentPresenter by itself does not have any Visual Style
's. It's merely a placeholder for the Content
of the Control
in the Style
which it resides in.
To modify the Foreground
in your custom Button
's Style.ControlTemplate
, you could use the attached property TextElement.Foreground
on the ContentPresenter
with a Trigger
for IsEnabled="False"
...
<ControlTemplate.Triggers>
...
<Trigger Property="IsEnabled"
Value="False">
<Setter TargetName="contentPresenter"
Property="TextElement.Foreground"
Value="Red" />
</Trigger>
</ControlTemplate.Triggers>
...
You can accordingly do the same via Storyboard
's or the VisualStateManager
via blend for the same property.
Note:
Very important to understand that by doing this^^ we are assuming the Button
using this Style
to have its Content
as some Text. If your Button.Content
is something else like another FrameworkElement
(say a ComboBox
) You will not see it become "Red".
Found a "Hacky" way to do this for any element by using ControlTemplate.Resources
and 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>
Sadly you can't use button's VisualStateManager
this way.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With