ColorAnimation застрял на цвете при повторном нажатии кнопки
У меня есть обычай button-style
с ColorAnimation
,
Это работает нормально, но при многократном нажатии, оно остается на целевом цвете.
<Style TargetType="Button" x:Key="mainButton">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}">
<ContentPresenter Content="{TemplateBinding ContentControl.Content}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsPressed" Value="True">
<Trigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Duration="0:0:0.10"
Storyboard.TargetProperty="(Foreground).(SolidColorBrush.Color)"
To="Red"
AutoReverse="True"/>
</Storyboard>
</BeginStoryboard>
</Trigger.EnterActions>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Как я могу решить это?
2 ответа
Вы не установили From
недвижимость на вашем ColorAnimation
, Поэтому, когда вы нажимаете кнопку в середине анимации, раскадровка принимает текущий Foreground
значение цвета как его From
и это цвет, к которому анимация возвращается.
Теперь, когда вы несколько раз нажимаете кнопку, From
цвет все ближе и ближе к красному, создавая впечатление, что цвет застрял на красном.
Обновить:
Этот ответ только указывает на проблему. Обратитесь к ответу Вив для элегантного решения
Обновить
Да, если вы не можете позволить себе удалить Storyboard
в Trigger.ExitActions
тогда вы действительно должны обратиться к From
вопрос для промежуточного запуска Storyboard
это ты.
Однако, указав жестко From
не единственное решение. Вы можете позволить анимации сбросить себя до базового базового цвета при запуске.
Преимущество этого заключается в том, чтобы не указывать From
у вас есть на одну вещь меньше, чтобы следить за будущими обновлениями.
<Storyboard AutoReverse="True">
<!-- By not specifying a To or From we pretty much reset the property to un-animated state(Exactly what the hard-coded from does) -->
<ColorAnimation Duration="0:0:0"
Storyboard.TargetProperty="(Foreground).(SolidColorBrush.Color)" />
<!-- This part is same as original time to kick into new Foreground as desired -->
<ColorAnimation Duration="0:0:1.5"
Storyboard.TargetProperty="(Foreground).(SolidColorBrush.Color)"
To="Red" />
</Storyboard>