WPF анимация с датриггерами - PullRequest
2 голосов
/ 05 января 2011

У меня есть прямоугольник, для которого я анимирую цвет фона.

Он должен меняться на зеленый при каждом увеличении определенного числа.И красный, когда он идет вниз.Если число какое-то время не меняется, оно медленно возвращается к своему стандартному цвету

Таким образом, анимация очень быстро меняет фон с серого на красный, а затем требуется несколько секунд, чтобы вернуться к серому.

Я добавил как 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);
    }            
}

Метод вызывается при каждом изменении числа (это делается классом, который прослушивает внешний канал)

1 Ответ

0 голосов
/ 05 января 2011

[Предостережение: я не успел воссоздать и проверить это.Я просто подумал, что это может помочь.]

Причина, по которой триггер не срабатывает, состоит в том, что значение не изменяется.Когда вы, например, продолжаете расти, значение BidChangeDirectionIndicator остается равным 1.

Возможно, самое простое, что нужно сделать, это установить для него другое значение (0), а затем желаемое значение.

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