Я не думаю, что подход с Trigger.EnterAction будет работать.
Чтобы применить новую анимацию, вам нужно будет указать Trigger.ExitAction, который удалит текущую анимацию, и в результате цвет вернется к значению по умолчанию. Когда вы затем запустите новую анимацию, она будет анимироваться от своего цвета по умолчанию (который теперь стал текущим цветом) к новому цвету.
Привязка анимации От значения к некоторому динамическому значению не работает, потому что функция Freezable.
Я решил эту проблему, введя прикрепленное свойство, генерирующее анимацию на лету из любого цвета, который объект в данный момент имеет, к указанному:
<TextBlock Text="text">
<local:AnimationHelper.Animation>
<local:ConstantColorAnimation
TargetProperty="Foreground"
To="{Binding CurrentState, Converter={StaticResource stateToColor}}"
Speed="1.5" />
</local:AnimationHelper.Animation>
</TextBlock Text="text">
Это будет анимировать передний план TextBlock всякий раз, когда свойство CurrentState изменяется на новый цвет, который возвращается StateToColorConverter. Это из DataTemplate для ViewModel, который имеет свойство CurrentState. Если вы хотите, чтобы он связывался непосредственно с текстом, вам нужно написать TextToColorConverter.
Вот пример соответствующего кода для анимации ConstantColor:
private void CreateAnimation()
{
if (this.ResolvedTargetProperty == null)
{
return;
}
var from = (Color)this.Context.GetValue(this.ResolvedTargetProperty);
this.RemoveAnimation(this.ResolvedTargetProperty);
if (this.Speed == 0)
{
this.Context.SetValue(this.ResolvedTargetProperty, from);
return;
}
if (this.Speed < 0)
{
this.Context.SetValue(this.ResolvedTargetProperty, this.To);
return;
}
var a = new ColorAnimation(
from, this.To, new Duration(TimeSpan.FromSeconds(Math.Abs(this.To - from) / this.Speed)));
this.Context.BeginAnimation(this.ResolvedTargetProperty, a);
}
Вместо того, чтобы делать все самостоятельно, вы также можете использовать Behavior Framework от Silverlight. AFAIK полностью совместим с WPF и вы можете использовать сборку напрямую. Вы могли бы даже найти поведение , которое уже делает то, что вам нужно.