2009-12-14 60 views
1

我有一種情況,需要確定是否已達到故事板的末尾,然後需要查找結束。如何查找Silverlight中Storyboard的持續時間?

我想做的事:

storyboard.Seek(timespan); 

然而,如果時間跨度比故事板的病程長,我得到一個異常。如果我看

storyboard.Duration.TimeSpan 

我得到一個錯誤,因爲持續時間是自動的。這意味着我不能做「如果(timespan> storyboard.Duration.TimeSpan)...」

一旦我知道我正在尋找的位置已經超過故事板的末尾,我只需要尋求故事板的結尾。我可以通過storyboard.Seek(storyboard.Duration.TimeSpan)來做到這一點,但同樣,我不能使用持續時間,因爲它是自動的。

似乎我所有的問題都可以解決,如果我可以強制持續時間遠離自動。希望我只是缺少一些簡單的東西。

回答

3

也許我不明白的東西,但如果你總是需要尋求到動畫結束爲什麼你不使用seektofill方法?
MSDN link

而且,這裏是故事板期限結構的文件,並就如何,你可以,如果你需要將其設置爲自動以外的東西的解釋 - 但是如果你總是需要去年底我」 d只需使用skiptofill方法:
MSDN link

+0

謝謝您的回答。你的建議幫助我找到了一個好的解決方案。 – grimus 2009-12-14 22:31:07

1

通過查看Egor鏈接的頁面,我能夠想出一個很好的解決方案。 (標出Egor作爲答案,以確保他獲得信貸。)

設置故事板上的持續時間是答案的一部分,但還不夠。我使用這個故事板作爲長時間運行的自定義控件的一部分 - 我不能保證自定義控件的重新設計版本會設置故事板的持續時間。

爲了解決這個問題,我首先檢查一下持續時間是否可用。如果不是,則跳至末尾,並使用GetCurrentTime()來確定故事板長度的末尾是什麼。

這裏是我的完整的解決方案:

public void UpdateControl() 
{ 
    if (!App.IsDesignTime() && storyboard != null) 
    { 
     TimeSpan begin = DateTime.UtcNow - OriginTime.ToUniversalTime(); 
     TimeSpan end; 

     // If Storyboard.Duration is set, use it to set the animation to its correct position. 
     // If it isn't set, attempt to set by seeking to the end of the animation. 
     if (storyboard.Duration.HasTimeSpan) 
      end = storyboard.Duration.TimeSpan; 
     else 
     { 
      storyboard.SkipToFill(); 
      end = storyboard.GetCurrentTime(); 
     } 

     if (begin > end) 
      begin = end; 

     storyboard.Begin(); 
     storyboard.Seek(begin); 
    } 
}