2010-04-19 65 views
0

我有一個將RepeatBehavior設置爲Forever的WPF動畫。每次動畫重複時都需要更新。我無法弄清楚如何捕捉重複事件,完整的事件處理程序不適用於此。動畫間隔是可編程的,並由一些環境因素決定。所以使用定時器並不是一個整潔的方法。我怎樣才能做到這一點?如何在重複WPF動畫時觸發事件處理程序

回答

0

而不是有一個永遠的RepeatBehavior,讓它只運行一次,並捕獲Completed事件。執行處理,然後使用適當的DependencyProperty和動畫調用BeginAnimation。

舉例來說,這裏是一個(確實有點傻)爲例來說明我的意思。

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 2010-04-20 02:02:09

0

我發現了一個相當優雅的解決方案來解決這個問題。它只需要Timeline元素添加事件處理程序的CurrentTimeInvalidated事件:

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; 
    } 
} 
相關問題