Событие раскадровки WPF не запускается - PullRequest
3 голосов
/ 06 мая 2011

У меня есть простая раскадровка, которая повторяется и автоматически меняется. Когда он достигает конца и автоматически меняет направление, я хотел бы запустить событие в коде. То же самое, когда это повторяется. Как я могу сделать это? В конечном итоге я играю WAV-файл во время этих двух событий. Спасибо.

1 Ответ

3 голосов
/ 08 мая 2011

WPF-анимации управляются с помощью AnimationClock (что-то вроде необычного таймера).AnimationClock имеет свойство CurrentProgress, которое варьируется от 0 до 1;где 0 - начальная точка, а 1 - конечная точка.Повторяющаяся раскадровка постепенно изменит CurrentProgress с 0 на 1 на 0 на 1 ...

Когда AnimationClock дает анимации команду визуализировать свой следующий кадр, анимация вызывает событие CurrentTimeInvalidated.Аргумент отправителя этого события - AnimationClock.Вы можете проверить CurrentProgress в это время.Однако, поскольку это событие срабатывает только при прорисовке нового кадра, CurrentProgress, вероятно, никогда не будет точно равен 0 или ровно 1. Вместо этого вам нужно искать тренды.Когда вы видите изменение тренда, это означает, что цикл начался или развернулся.

Пример xaml:

<Grid x:Name="uxGrid" Background="White">
    <Grid.Triggers>
        <EventTrigger RoutedEvent="Grid.Loaded">
            <BeginStoryboard>
                <Storyboard>
                    <ColorAnimation Storyboard.TargetName="uxGrid" Changed="ColorAnimation_Changed" CurrentTimeInvalidated="ColorAnimation_CurrentTimeInvalidated"  Storyboard.TargetProperty="Background.Color" From="Blue" To="Green" Duration="0:0:5" AutoReverse="True" RepeatBehavior="Forever" />
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Grid.Triggers>
</Grid>

Пример кода:

private double? _clockLastProgress;  // Tracks Trend
private bool    _clockLastDecreased; // Tracks Trend Direction

private void ColorAnimation_CurrentTimeInvalidated(object sender, EventArgs e)
{
    AnimationClock clock = sender as AnimationClock;

    if (clock != null && clock.CurrentProgress.HasValue)
    {
        if (!_clockLastProgress.HasValue)
        {
            // Your Code Here
        }
        else
        {
            if (_clockLastDecreased)
            {
                if (clock.CurrentProgress > _clockLastProgress)
                {
                    // Your Code Here
                    _clockLastDecreased = false;
                }
            }
            else
            {
                if (clock.CurrentProgress < _clockLastProgress)
                {
                    // Your Code Here
                    _clockLastDecreased = true;
                }
            }
        }

        _clockLastProgress = clock.CurrentProgress.Value;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...