带有数据触发器的WPF动画

时间:2011-01-05 09:51:39

标签: wpf xaml animation datatrigger

我有一个矩形,我正在制作背景颜色。

每当特定数字上升时,它应该变为绿色。当它下降时红色。如果数字暂时没有变化,它会慢慢淡化为默认颜色

因此动画会非常快速地将背景从灰色变为红色,然后需要几秒钟才能淡化为灰色。

我添加了DataTrigger,它绑定为1或-1,具体取决于数字的变化

问题是如果数字不断上升,动画就不会重新启动。

e.g。如果数字序列分别为1,2,3,4,5。那么我希望动画在每个数字更改时重新启动

我正在使用的代码在

之下
<Rectangle.Style>
    <Style>
        <Style.Triggers>
            <DataTrigger Binding="{Binding BidChangeDirectionIndicator}"
                         Value="-1">
                <DataTrigger.EnterActions>
                    <BeginStoryboard x:Name="bidDownStory">
                        <Storyboard>
                            <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Color)">
                                <EasingColorKeyFrame KeyTime="0"
                                                     Value="#FF79797A" />
                                <EasingColorKeyFrame KeyTime="0:0:0.2"
                                                     Value="#FFF13B29" />
                                <EasingColorKeyFrame KeyTime="0:0:10.0"
                                                     Value="#FF79797A" />
                            </ColorAnimationUsingKeyFrames>
                            <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[0].(GradientStop.Color)">
                                <EasingColorKeyFrame KeyTime="0"
                                                     Value="#FF2B2B2B" />
                                <EasingColorKeyFrame KeyTime="0:0:0.2"
                                                     Value="#FF3F0606" />
                                <EasingColorKeyFrame KeyTime="0:0:10.0"
                                                     Value="#FF2B2B2B" />
                            </ColorAnimationUsingKeyFrames>
                        </Storyboard>
                    </BeginStoryboard>
                </DataTrigger.EnterActions>
                <DataTrigger.ExitActions>
                    <StopStoryboard BeginStoryboardName="bidDownStory" />
                </DataTrigger.ExitActions>
            </DataTrigger>
        </Style.Triggers>
    </Style>

和我绑定的ViewModel看起来像这样

private int _bidChangeDirectionIndicator;
public int BidChangeDirectionIndicator
{
    get { return _bidChangeDirectionIndicator; }
    set
    {
        _bidChangeDirectionIndicator = value;
        RaisePropertyChanged("BidChangeDirectionIndicator");
    }
}

....

public void Update(RateInfo rateInfo)
{
    if (rateInfo.Bid != Bid)
    {
        BidChangeDirectionIndicator = Math.Sign(rateInfo.Bid - Bid);
    }            
}

每次数字更改时都会调用该方法(这是由正在侦听外部Feed的类完成的)

1 个答案:

答案 0 :(得分:0)

[警告:我没有时间重新创建并测试它。我只是觉得它可能会有所帮助。]

触发器未触发的原因是该值不会更改。例如,当您继续上升时,BidChangeDirectionIndicator的值仍为1.

也许最简单的方法是将其设置为另一个值(0),然后设置为您想要的值。

public void Update(RateInfo rateInfo)
{
    if (rateInfo.Bid != Bid)
    {
        BidChangeDirectionIndicator = Math.Sign(rateInfo.Bid - Bid);
    }            
    else
    {
        BidChangeDirectionIndicator = 0;
        BidChangeDirectionIndicator = rateInfo.Bid;
    }
}