2012-01-23 41 views
0

我有一個簡單的動畫故事板看起來像這樣:向後尋求動畫故事板到一個特定的點,然後打

<Window.Resources> 
    <Storyboard x:Key="fader"> 
     <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)"> 
      <SplineDoubleKeyFrame KeyTime="0:0:0" Value="0"/> 
      <SplineDoubleKeyFrame KeyTime="0:0:0.5" Value="1"/> 
     </DoubleAnimationUsingKeyFrames> 
     <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)"> 
      <SplineDoubleKeyFrame KeyTime="0:0:4" Value="1"/> 
      <SplineDoubleKeyFrame KeyTime="0:0:6" Value="0"/> 
     </DoubleAnimationUsingKeyFrames> 
    </Storyboard> 
</Window.Resources> 

正如你所看到的,它消失的目標,等待3.5秒,然後淡出它。我在發生事件時出現的通知程序窗口上使用它。

它通過調用代碼以下作品完美,當事件發生:

board = (Storyboard)FindResource("fader"); 
board.Begin(this); 

不過,我想處理情況,同時通知窗口已經顯示出第二事件發生時的情況。在這種情況下,我正在尋找的行爲是修改窗口的內容以反映第二個事件(簡單),並且通過它的生命週期將故事板「倒回」到0.5s,即。就在它出現之後。

換句話說,第二個事件應該會導致在第二個事件發生之後3.5秒發生淡出,即使窗口已經在0到6秒之間的任何地方出現過了。

我已經試圖通過檢測窗口的透明度要做到這一點,如果它是> 0,則調用下面:

board.Seek(this,TimeSpan.FromSeconds(0.5),TimeSeekOrigin.BeginTime); 

然而,這似乎並沒有做任何事情,即使我反覆發射事件,窗口內容改變,但通知者忠實地淡入,等待3.5秒,然後再次淡出。

爲什麼這項工作,這是做我想要實現的最好方式?

回答

1

我認爲這裏的問題是,你已經淡入淡出作爲一個單一的動畫。我可能會做類似如下:

  1. 將動畫分成兩部分:淡入和淡出。
  2. 定義一個displayPeriod恆定值3.5s(或任何你想要的,用戶可配置的設置?)。
  3. 當有通知進入時,觸發一個事件。如果是第一個通知,請運行淡入動畫。如果不是第一次通知,請轉至5.
  4. 啓動一個計時器,該計時器將倒數displayPeriod秒數。
  5. 如果在計時器到期之前發出另一個通知,請將其取消並重新啓動。
  6. 當計時器最終到期時,運行淡出動畫。

還有更多的代碼需要寫入,但它可能比試圖將動畫填充到故事板中的正確點更簡單。

如果你想在實現這個過程中使用一些很酷且引人注目的技術,請查看Reactive Extensions來處理你的通知和計時器事件流。

+0

同意 - 如果我從不想改變它,那麼擁有單個動畫的原始想法可能沒問題。然而,新的要求意味着將其全部拋開,並以不同的方式進行。將有一個bash。 – growse

+0

它的工作原理。好極了!! – growse

+0

非常好!很高興能使用:-) – alastairs