【问题标题】:WPF Animation with datatriggers带有数据触发器的 WPF 动画
【发布时间】:2011-01-05 22:23:12
【问题描述】:

我有一个矩形,我正在为它的背景颜色设置动画。

每次特定数字上升时,它都应变为绿色。当它下跌时是红色的。如果数字有一段时间没有变化,它会慢慢变回默认颜色

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

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

问题是,如果数字不断增加,动画不会重新开始。

例如如果数字序列变为 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);
    }            
}

每次数字变化时都会调用该方法(这是由正在侦听外部提要的类完成的)

【问题讨论】:

  • 很难重现这个。您也可以发布您的课程代码吗?你有没有试过在这些动画上加上FillBehavior="Stop"
  • 嗨 - 我已经添加了上面的重要部分。我想你可以用一个在循环中每隔几秒调用一次更新的类来复制它
  • 另外 - FillBehaviour="Stop" 不幸的是没有工作
  • 尝试将该情节提要移动到资源中。

标签: wpf xaml animation datatrigger


【解决方案1】:

[警告:我没有时间重新创建和测试这个。我只是认为它可能会有所帮助。]

触发器不触发的原因是值没有改变。例如,当您继续上涨时,BidChangeDirectionIndicator 的值保持为 1。

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

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

【讨论】:

    猜你喜欢
    • 2014-10-09
    • 2014-05-13
    • 2014-06-25
    • 2016-03-12
    • 2011-10-04
    • 2015-12-14
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    相关资源
    最近更新 更多