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;
}
}