一般鎖死問題都是出在后臺代碼寫的動畫中,以下為轉載的解決方案!
方法一:將動畫的 FillBehavior 屬性設置為 Stop:
storyboard.FillBehavior = FillBehavior.Stop;
通過將FillBehavior設置為Stop,即通知動畫在到達其活動期末尾后停止
影響其目標關聯屬性。雖然達到了目的,但必須等待動畫結束時才會生效,且更關鍵的是之前被storyboard修改過的所有關聯屬性值此時都被還原成了初始值。因此,此方法只適合用于制作類似網頁中的導航菜單按鈕:當鼠標懸停在菜單上時,菜單圖形按鈕執行一段華麗的變化動畫;當鼠標移開后即變回為初始圖片。
方法二:移除整個動畫板(Storyboard)。此方法必須通過類似
Leader.BeginStoryboard(storyboard, HandoffBehavior.SnapshotAndReplace, true);或
storyboard.Begin(Leader, HandoffBehavior.SnapshotAndReplace, true);
這兩種方式啟動動畫,然后在需要解鎖時通過
storyboard.Remove(Leader); storyboard = null; 通知動畫板動畫停止影響名為Leader對象的目標關聯屬性,并移除storyboard。需要特別注意的是①必須將動畫的IsControllable參數設置為true;②HandoffBehavior最好設置為SnapshotAndReplace,此枚舉的作用是:新動畫將替換它們所應用到的關聯屬性上的任何現有動畫。
方法三:從單個關聯屬性移除動畫。同樣的以精靈角色朝向為例,如果該屬性已被Storyboard鎖定,那么如果此時需要對其值進行更改,我們可以通過類似:
Leader.BeginAnimation(QXSpirit.DirectionProperty, null);或
Leader.ApplyAnimationClock(QXSpirit.DirectionProperty, null);
這兩種方法來禁止關聯到Leader的動畫繼續影響Leader的DirectionProperty關聯屬性(此方法對于非動畫板動畫
也同樣有效)。接著后面我們就可以輕松的通過Leader.Direction = 0 為精靈的朝向屬性進行賦值并在畫面中得到體現。
以上三種解決方案 在WPF中靈活的配合storyboard.Children.Clear();使用幾乎可以應付任何關于Storyboard鎖死關聯屬性的問題;但是在Silverlight 中卻往往不盡如人意。畢竟只是WPF的子集,在功能與方法上有著太少的支持。因此,我拓展了以下兩種解決方案 ,更重要的,它們均為WPF/Silverlight 通用的且藥到病除的終極策略。
方法四:可以通過每次運行新的動畫時先暫停之前的動畫(注意,是暫停(Pause)而不是停止(Stop)),例如storyboard.Pause(Leader);然后再創建一個新的動畫板storyboard = new Storyboard();這樣,之前被storyboard修改過的關聯屬性目標值會被新的storyboard作為起點屬性值,從而完美實現關聯屬性在動畫與動畫之間的銜接。有些朋友會問那之前的storyboard是否會繼續占用內存空間?對于.net的內存回收機制我們無法控知,根據我多方查閱的資料,若您不放心,不妨在創建新的Storyboard前,通過storyboard = null 將之注銷掉,在Silverlight 動畫中我是這樣做的,實踐證明此方法確實達到的目的。
方法五:以毒攻毒。既然是Storyboard鎖死了我們需要更改的關聯屬性,那么我們同樣可以通過Storyboard動畫的形式來賦值更改這些關聯屬性。此方法乃下下策,缺點是毫無性能而言;優點是萬能性:適合一切被Storyboard鎖死的關聯屬性的修改,且無論是在WPF還是Silverlight 中。下面同樣以精靈的朝向為例,我們可以通過:
DoubleAnimation doubleAnimation = new DoubleAnimation();
doubleAnimation.To = direction;
doubleAnimation.Duration = new Duration(TimeSpan.FromMilliseconds(10));
Storyboard.SetTarget(doubleAnimation, spirit);
Storyboard.SetTargetProperty(doubleAnimation, new PropertyPath("Direction"));
storyboard.Children.Add(doubleAnimation);
storyboard.Begin();
這樣的動畫形式對QXSpirit.DirectionProperty關聯屬性進行強行更改。
本節小結:希望以上5種解鎖Storyboard關聯屬性的解決方案 能對大家的WPF/Silverlight 動畫開發有所幫助;同時,如果哪些地方有寫得不妥或有錯漏的也請大家不吝賜教,我會及時進行修改及更正。