У меня есть анимация WPF с RepeatBehavior, установленным на Forever. Есть что-то нужно обновлять каждый раз, когда анимация повторяется. Я не могу понять, как поймать событие повторения, обработчик полного события не работает для этого. Интервал анимации программируется и определяется некоторыми факторами окружающей среды. Поэтому использование таймера не является аккуратным подходом. Как я могу это сделать?как вызвать обработчик события при повторении анимации WPF
0
A
ответ
0
Вместо того, чтобы иметь RepeatBehavior of Forever, попробуйте запустить его только один раз и поймать событие Completed. Сделайте свою обработку, а затем вызовите BeginAnimation, используя надлежащую DependencyProperty и анимацию.
Например, здесь (предположительно глупый) пример, чтобы показать, что я имею в виду.
XAML:
<TextBlock x:Name="txtExample"
Text="Gradients Are Neat"
FontSize="50">
<TextBlock.Foreground>
<LinearGradientBrush x:Name="rgbForeground">
<LinearGradientBrush.GradientStops>
<GradientStop x:Name="Color1" Color="#12BC23" Offset="0.0" />
<GradientStop x:Name="Color2" Color="#AA0499" Offset="0.5" />
<GradientStop x:Name="Color3" Color="#792BDF" Offset="1.0" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</TextBlock.Foreground>
<TextBlock.Triggers>
<EventTrigger RoutedEvent="TextBlock.Loaded">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard x:Name="SomeStoryboard">
<ColorAnimation x:Name="changeColor1"
Storyboard.TargetName="Color1"
Storyboard.TargetProperty="Color"
Duration="0:0:3"
To="#81AD21"/>
<ColorAnimation x:Name="changeColor2"
Storyboard.TargetName="Color2"
Storyboard.TargetProperty="Color"
Duration="0:0:2"
To="#29910A"/>
<ColorAnimation x:Name="changeColor3"
Storyboard.TargetName="Color3"
Storyboard.TargetProperty="Color"
Duration="0:0:5"
To="#BB4923"
Completed="changeColor3JustOnce_Completed" />
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</TextBlock.Triggers>
</TextBlock>
Код За:
private void changeColor3_Completed(object sender, EventArgs e)
{
Color3.BeginAnimation(GradientStop.ColorProperty, changeColor3);
}
Обратите внимание, что Завершена событие на раскадровку, несмотря на объявленный в анимации. Если в некоторых других анимациях вы должны были установить значение RepeatForever в true, событие никогда не будет запущено.
0
Я нашел довольно элегантное решение этой проблемы. Она требует только добавления EventHandler к CurrentTimeInvalidated
события на Timeline
элемент:
private TimeSpan _lastTime;
private void Animation_CurrentTimeInvalidated(object sender, EventArgs e)
{
var clock = sender as AnimationClock;
if (clock != null && clock.CurrentTime.HasValue)
{
if (clock.CurrentTime.Value < this._lastTime)
{
//TODO: Add any behavior to perform on a repeat here.
}
this._lastTime = clock.CurrentTime.Value;
}
}
Это просто мой путь. Я определяю другую анимацию для этого с тем же BeginTime и Duration, потому что я не уверен, что временная последовательность достаточно точная. В настоящее время он работает отлично. Благодарю. – Hugo