private Storyboard CreatePeelAnimationStoryboard(int playerViewModelIndex, TileAnimationDirection direction, out Grid tile)
        {
            //
            // Initialize the tile grid.
            //

            tile = new Grid()
            {
                Width = 50,
                Height = 50,
                Background = new SolidColorBrush(Colors.DodgerBlue)
            };

            tile.VerticalAlignment = VerticalAlignment.Top;
            tile.HorizontalAlignment = HorizontalAlignment.Left;
            tile.SetValue(Grid.ColumnProperty, 0);

            RootGrid.Children.Add(tile);

            tile.RenderTransformOrigin = new Point(.5, .5);
            tile.RenderTransform = new CompositeTransform();


            var storyboard = new Storyboard();

            storyboard.Children.Add(CreateScaleXKeyFrames());

            storyboard.Children.Add(CreateScaleYKeyFrames());

            storyboard.Children.Add(CreateTranslationKeyFrames(playerViewModelIndex, direction, tile));

            storyboard.Children.Add(CreateOpacityKeyFrames());

            return storyboard;
        }
        private DoubleAnimationUsingKeyFrames CreateTranslationKeyFrames(int playerViewModelIndex, TileAnimationDirection direction, Grid tile, int delay = 0)
        {
            Point BeginPoint;
            Point EndPoint;

            var animation = new DoubleAnimationUsingKeyFrames();

            Storyboard.SetTargetProperty(animation, "(UIElement.RenderTransform).(CompositeTransform.TranslateY)");

            var dumpCircleGt = InnerDumpCircle.TransformToVisual(pageRoot);

            var animationTargetContainer = PlayerPanel.ItemContainerGenerator.ContainerFromIndex(playerViewModelIndex);

            var grid = VisualTreeHelper.GetChild(animationTargetContainer, 0) as Grid;

            var playerViewModelGt = grid.TransformToVisual(pageRoot);

            if (direction == TileAnimationDirection.Down)
            {
                BeginPoint = dumpCircleGt.TransformPoint(new Point(0, 0));

                EndPoint = playerViewModelGt.TransformPoint(new Point(0, 0));

                tile.Margin = new Thickness(BeginPoint.X + InnerDumpCircle.Width / 2 - tile.Width / 2, BeginPoint.Y - tile.Height / 2 + 10/* + InnerDumpCircle.Height / 2*/, 0, 0);
            }
            else
            {
                EndPoint = dumpCircleGt.TransformPoint(new Point(0, 0));

                BeginPoint = playerViewModelGt.TransformPoint(new Point(0, 0));

                tile.Margin = new Thickness(BeginPoint.X + InnerDumpCircle.Width / 2 + 15, tile.Height / 2 + 10, 0, 0);
            }

            var acFrame = new EasingDoubleKeyFrame();
            acFrame.KeyTime = new KeyTime();
            acFrame.KeyTime = TimeSpan.FromMilliseconds(0);
            acFrame.Value = BeginPoint.Y;

            var bcFrame = new EasingDoubleKeyFrame();
            bcFrame.KeyTime = new KeyTime();
            bcFrame.KeyTime = TimeSpan.FromMilliseconds(0 + delay);
            bcFrame.Value = BeginPoint.Y;


            var cFrame = new EasingDoubleKeyFrame();
            cFrame.KeyTime = new KeyTime();
            cFrame.KeyTime = TimeSpan.FromMilliseconds(100 + delay);
            cFrame.Value = BeginPoint.Y;

            var dFrame = new EasingDoubleKeyFrame();
            dFrame.KeyTime = new KeyTime();
            dFrame.KeyTime = TimeSpan.FromMilliseconds(500 + delay);
            dFrame.Value = EndPoint.Y;

            dFrame.EasingFunction = new QuadraticEase();
            dFrame.EasingFunction.EasingMode = EasingMode.EaseInOut;

            animation.KeyFrames.Add(acFrame);
            animation.KeyFrames.Add(bcFrame);
            animation.KeyFrames.Add(cFrame);
            animation.KeyFrames.Add(dFrame);

            return animation;
        }