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>
Другие вопросы по тегам