private void ToDoItemDeletedAction(FrameworkElement deletedElement) { _deleteSound.Play(); var trans = deletedElement.GetHorizontalOffset().Transform; trans.Animate(trans.X, -(deletedElement.ActualWidth + 50), TranslateTransform.XProperty, 300, 0, new SineEase() { EasingMode = EasingMode.EaseOut }, () => { // find the model object that was deleted ToDoItemViewModel deletedItem = deletedElement.DataContext as ToDoItemViewModel; // determine how much we have to 'shuffle' up by double elementOffset = -deletedElement.ActualHeight; // find the items in view, and the location of the deleted item in this list var itemsInView = _todoList.GetItemsInView().ToList(); var lastItem = itemsInView.Last(); int startTime = 0; int deletedItemIndex = itemsInView.Select(i => i.DataContext) .ToList().IndexOf(deletedItem); // iterate over each item foreach (FrameworkElement element in itemsInView.Skip(deletedItemIndex)) { // for the last item, create an action that deletes the model object // and re-renders the list Action action = null; if (element == lastItem) { action = () => { // clone the list _todoItems.Remove(deletedItem); // re-populate our ObservableCollection _todoItems.Reset(); }; } // shuffle this item up TranslateTransform elementTrans = new TranslateTransform(); element.RenderTransform = elementTrans; elementTrans.Animate(0, elementOffset, TranslateTransform.YProperty, 200, startTime, null, action); startTime += 10; } }); }
private void ToDoItemBounceBack(FrameworkElement fe) { var trans = fe.GetHorizontalOffset().Transform; trans.Animate(trans.X, 0, TranslateTransform.XProperty, 300, 0, new BounceEase() { Bounciness = 5, Bounces = 2 }); }