2010-04-19 2 views
0

У меня есть анимация WPF с RepeatBehavior, установленным на Forever. Есть что-то нужно обновлять каждый раз, когда анимация повторяется. Я не могу понять, как поймать событие повторения, обработчик полного события не работает для этого. Интервал анимации программируется и определяется некоторыми факторами окружающей среды. Поэтому использование таймера не является аккуратным подходом. Как я могу это сделать?как вызвать обработчик события при повторении анимации WPF

ответ

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

Это просто мой путь. Я определяю другую анимацию для этого с тем же BeginTime и Duration, потому что я не уверен, что временная последовательность достаточно точная. В настоящее время он работает отлично. Благодарю. – Hugo

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; 
    } 
} 
Смежные вопросы