如何使用WPF中自定義GridLengthAnimation?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
成都創(chuàng)新互聯(lián)公司主營龍泉驛網(wǎng)站建設的網(wǎng)絡公司,主營網(wǎng)站建設方案,重慶APP軟件開發(fā),龍泉驛h5微信小程序搭建,龍泉驛網(wǎng)站營銷推廣歡迎龍泉驛等地區(qū)企業(yè)咨詢
需求
我們想在編輯一個列表中某一個條目時,將編輯的詳情內(nèi)容也放置當前面,比如右側(cè)。
可以通過將一個Grid,分成兩個Cloumn,動態(tài)調(diào)整兩個Cloumn的Width,就可以實現(xiàn)這個需求。
我們知道,Clomun的Width是個,而默認的動畫沒有這樣子的。我們就需要自己實現(xiàn)這樣一人動畫。
設計
我們從Animation的類圖上看到
我們可以從需求
我們想在編輯一個列表中某一個條目時,將編輯的詳情內(nèi)容也放置當前面,比如右側(cè)。
可以通過將一個Grid,分成兩個Cloumn,動態(tài)調(diào)整兩個Cloumn的Width,就可以實現(xiàn)這個需求。
我們知道,Clomun的Width是個GridLength,而默認的動畫沒有這樣子的。我們就需要自己實現(xiàn)這樣一人動畫。
設計
我們從Animation的類圖上看到AnimationTimeline繼承,重寫其GetCurrentValue
public class GridLengthAnimation : AnimationTimeline { ////// Returns the type of object to animate /// public override Type TargetPropertyType => typeof(GridLength); ////// Creates an instance of the animation object /// ///Returns the instance of the GridLengthAnimation protected override System.Windows.Freezable CreateInstanceCore() { return new GridLengthAnimation(); } ////// Dependency property for the From property /// public static readonly DependencyProperty FromProperty = DependencyProperty.Register("From", typeof(GridLength), typeof(GridLengthAnimation)); ////// CLR Wrapper for the From depenendency property /// public GridLength From { get { return (GridLength)GetValue(GridLengthAnimation.FromProperty); } set { SetValue(GridLengthAnimation.FromProperty, value); } } ////// Dependency property for the To property /// public static readonly DependencyProperty ToProperty = DependencyProperty.Register("To", typeof(GridLength), typeof(GridLengthAnimation)); ////// CLR Wrapper for the To property /// public GridLength To { get { return (GridLength)GetValue(GridLengthAnimation.ToProperty); } set { SetValue(GridLengthAnimation.ToProperty, value); } } ////// Animates the grid let set /// /// The original value to animate /// The final value /// The animation clock (timer) ///Returns the new grid length to set public override object GetCurrentValue(object defaultOriginValue, object defaultDestinationValue, AnimationClock animationClock) { double fromVal = ((GridLength)GetValue(GridLengthAnimation.FromProperty)).Value; double toVal = ((GridLength)GetValue(GridLengthAnimation.ToProperty)).Value; if (fromVal > toVal) return new GridLength((1 - animationClock.CurrentProgress.Value) * (fromVal - toVal) + toVal, GridUnitType.Star); else return new GridLength(animationClock.CurrentProgress.Value * (toVal - fromVal) + fromVal, GridUnitType.Star); }
如上所示,我們仿著默認動畫實現(xiàn)了From,To,同時將其屬性定義為GridLength,當動畫執(zhí)行時,我們重寫了GetCurrentValue,使其根據(jù)From/To屬性相關聯(lián)。
優(yōu)化
通過以上代碼,我們實現(xiàn)了在GridLength變化時,實現(xiàn)動畫。但是,試用后我們發(fā)現(xiàn),動畫,有點太線性。這個時候,怎么辦?
可以通過引入EasingFunction來實現(xiàn)。我們知道EasingFunction其實就是一個與時間t有關的時間函數(shù)f(t).通過時間函數(shù)的處理,我們使動畫過渡不要那么線性。
////// The public const string EasingFunctionPropertyName = "EasingFunction"; ///dependency property's name. /// /// Gets or sets the value of the public IEasingFunction EasingFunction { get { return (IEasingFunction)GetValue(EasingFunctionProperty); } set { SetValue(EasingFunctionProperty, value); } } ////// property. This is a dependency property. /// /// Identifies the public static readonly DependencyProperty EasingFunctionProperty = DependencyProperty.Register( EasingFunctionPropertyName, typeof(IEasingFunction), typeof(GridLengthAnimation), new UIPropertyMetadata(null));dependency property. ///
對應的,還要重寫GetCurrentValue函數(shù)。
public override object GetCurrentValue(object defaultOriginValue, object defaultDestinationValue, AnimationClock animationClock) { double fromVal = ((GridLength)GetValue(FromProperty)).Value; double toVal = ((GridLength)GetValue(ToProperty)).Value; //check that from was set from the caller //if (fromVal == 1) // //set the from as the actual value // fromVal = ((GridLength)defaultDestinationValue).Value; double progress = animationClock.CurrentProgress.Value; IEasingFunction easingFunction = EasingFunction; if (easingFunction != null) { progress = easingFunction.Ease(progress); } if (fromVal > toVal) return new GridLength((1 - progress) * (fromVal - toVal) + toVal, GridUnitType.Star); return new GridLength(progress * (toVal - fromVal) + fromVal, GridUnitType.Star); }
使用
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。