2016-07-25 4 views
1

Я хочу удалить анимацию из моего целевого свойства, потому что я Unable to set the property after its animation.Как удалить анимацию после ее завершения

Итак, в соответствии с answer вопроса выше, я должен удалить анимацию после ее завершения. Но как это сделать?

Вот мой код:

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(); 

Где я мог удалить анимацию после его завершения?

+1

Может быть глупый вопрос, но где и как вы установили, что анимация? – lokusking

+0

@lokusking Я отредактировал мой вопрос :) – Drarig29

ответ

0

я нашел мое решение here, в «Удалить анимацию из индивидуальной собственности» части.

Я добавил это в моем 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); 
} 
1

Просто измените использование на:

GridLengthAnimation gridAnim = new GridLengthAnimation() { 
      Name = "gridAnim", 
      Target = this.MainGrid.ColumnDefinitions[1], 
      Duration = new Duration(TimeSpan.FromMilliseconds(1000)) 
      }; 

      gridAnim.From = new GridLength(1, GridUnitType.Star); 
      gridAnim.To = new GridLength(0, GridUnitType.Star); 
//Cleanup on Complete 
      gridAnim.Completed += (sender, args) => { 
                var xx = sender as AnimationClock; 
                (xx.Timeline as GridLengthAnimation).Target = null; 
      }; 
      gridAnim.BeginAnimation(); 
+0

Извините, но это не сработает ... Я думаю, что это хорошая идея, но свойство все еще заблокировано. Может быть, есть другой способ? – Drarig29

Смежные вопросы