WPF - 根据TextBlock的上一个和当前值执行颜色动画

时间:2010-02-25 11:18:24

标签: wpf animation triggers styles

我必须更改TextBlock的颜色以指示数字是正数还是负数 - 红色表示负数,蓝色表示正数。我通过使用DataTrigger和转换器来完成此操作,无论数字是负数还是正数,它都返回True / False。 下一个要求有点棘手:当数字发生变化时,执行慢速淡入淡出以指示数字是否从前一个值增加或减少,然后它会淡化为上面指示其当前位置的颜色。

实现这一目标的最简单方法是什么?

感谢。

2 个答案:

答案 0 :(得分:0)

使用触发器的方法是正确的,要启动动画,您可以使用Trigger.EnterAction

答案 1 :(得分:0)

我不认为使用Trigger.EnterAction的方法会起作用。 为了应用新动画,您必须指定将删除当前动画的Trigger.ExitAction,因此颜色将恢复为默认值。然后,当您启动新动画时,它将从其默认颜色(现在已成为当前颜色)动画为新颜色。 绑定动画从值到某个动态值不起作用,因为auf Freezable。 我通过引入附加属性来解决这个问题,从动态动画生成动画,从当前对象的任何颜色到spechified动画:

<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">

每当CurrentState属性更改为StateToColorConverter返回的新颜色时,这将为TextBlock的前景设置动画。这是来自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);
}

您可以使用Silverlight中的行为框架,而不是自己完成这一切。 AFAIK它与WPF完全兼容,您可以直接使用该程序集。您甚至可以find a behavior,已经做了您需要的工作。