Не думаю, что подход с Trigger.EnterAction сработает. Чтобы применить новую анимацию, вам нужно будет указать Trigger.ExitAction, который удалит текущую анимацию, и в результате цвет вернется к своему значению по умолчанию. Когда вы затем запускаете новую анимацию, она будет анимироваться от цвета по умолчанию (который теперь стал текущим цветом) к новому цвету. Привязка значения Animations From к некоторому динамическому значению не работает, поскольку auf 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.
Вот пример соответствующего кода для ConstantColorAnimation:
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. Насколько я знаю, он полностью совместим с WPF, и вы можете напрямую использовать сборку. Вы даже можете найдите поведение, которое уже делает то, что вам нужно.
25.02.2010