我想从目标属性中删除该动画,因为我无法在其动画之后设置该属性。
因此,根据上述问题的答案,我必须在完成动画后将其删除。但是怎么办呢?
这是我的代码:
public class GridLengthAnimation : AnimationTimeline {
static GridLengthAnimation() {
FromProperty = DependencyProperty.Register("From", typeof(GridLength), typeof(GridLengthAnimation));
ToProperty = DependencyProperty.Register("To", typeof(GridLength), typeof(GridLengthAnimation));
}
public override Type TargetPropertyType {
get { return typeof(GridLength); }
}
protected override Freezable CreateInstanceCore() {
return new GridLengthAnimation();
}
public ContentElement Target { get; set; }
public static readonly DependencyProperty FromProperty;
public GridLength From {
get { return (GridLength) GetValue(FromProperty); }
set { SetValue(FromProperty, value); }
}
public static readonly DependencyProperty ToProperty;
public GridLength To {
get { return (GridLength) GetValue(ToProperty); }
set { SetValue(ToProperty, value); }
}
public void BeginAnimation() {
Target.BeginAnimation(ColumnDefinition.WidthProperty, null);
Target.BeginAnimation(ColumnDefinition.WidthProperty, this);
}
public IEasingFunction EasingFunction { get; set; } = new CubicEase() { EasingMode = EasingMode.EaseInOut };
public override object GetCurrentValue(object defaultOriginValue, object defaultDestinationValue, AnimationClock animationClock) {
double fromValue = ((GridLength) GetValue(FromProperty)).Value;
double toValue = ((GridLength) GetValue(ToProperty)).Value;
double newValue = 0;
if ((fromValue > toValue)) {
newValue = (1 - EasingFunction.Ease(animationClock.CurrentProgress.Value)) * (fromValue - toValue) + toValue;
return new GridLength(newValue, GridUnitType.Star);
} else {
newValue = EasingFunction.Ease(animationClock.CurrentProgress.Value) * (toValue - fromValue) + fromValue;
return new GridLength(newValue, GridUnitType.Star);
}
}
}
要开始动画,我在MainWindows.xaml.cs
文件中这样做:
GridLengthAnimation gridAnim = new GridLengthAnimation() {
Name = "gridAnim",
Target = mainGrid.ColumnDefinitions[1],
Duration = new Duration(TimeSpan.FromMilliseconds(1000))
};
gridAnim.From = new GridLength(1, GridUnitType.Star);
gridAnim.To = new GridLength(0, GridUnitType.Star);
gridAnim.BeginAnimation();
动画制作完成后在哪里可以删除?
我发现我的解决方案在这里,在“从一个单独的属性中删除动画”的一部分。
我将此添加到我的GridLengthAnimation
:
public void BeginAnimation() {
Completed += GridLengthAnimation_Completed;
Target.BeginAnimation(ColumnDefinition.WidthProperty, null);
Target.BeginAnimation(ColumnDefinition.WidthProperty, this);
}
private void GridLengthAnimation_Completed(object sender, EventArgs e) {
//unlocks the property
Target.BeginAnimation(ColumnDefinition.WidthProperty, null);
//holds the value at the end
((ColumnDefinition) Target).Width = new GridLength(((GridLength) GetValue(ToProperty)).Value, GridUnitType.Star);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句