public async Task PlayAnimation(TransformInfo[,] transformations)
        {
            #region
            if (_cellsContainer == null)
            {
                _cellsContainer = GetItemsPanel(GameBoard) as UniformGrid;
                Debug.Assert(_cellsContainer != null);
                foreach (var i in Range(0, Game.BoardHeight))
                {
                    foreach (var j in Range(0, Game.BoardWidth))
                    {
                        var content = _cellsContainer.Children[new Coordinate(i, j).ToIndex()] as ContentPresenter;
                        _grids[i, j] = content.ContentTemplate.FindName("CellGrid", content) as Grid;
                        Debug.Assert(_grids[i, j] != null);
                    }
                }
            }
            #endregion
            storyBoard.Children.Clear();
            foreach (var i in Range(0, transformations.GetLength(0)))
            {
                foreach (var j in Range(0, transformations.GetLength(1)))
                {
                    if (transformations[i, j].Destination != Coordinate.Nowhere)
                    {
                        var des      = transformations[i, j].Destination;
                        var wasNew   = transformations[i, j].WasNew;
                        var tempCell = new GridCell();
                        tempCell.Number = transformations[i, j].PreviousNumber;
                        var srcGrid = _grids[i, j];
                        gridsHaveTempCell.Add(srcGrid);
                        srcGrid.Children.Add(tempCell);
                        var desGrid    = _grids.GetValue(des);
                        var srcPos     = srcGrid.PointToScreen(new Point(0d, 0d));
                        var desPos     = desGrid.PointToScreen(new Point(0d, 0d));
                        var xDist      = desPos.X - srcPos.X;
                        var yDist      = desPos.Y - srcPos.Y;
                        var xAnimation = new DoubleAnimation(xDist, new Duration(new TimeSpan(0, 0, 0, 0, Math.Abs((int)(xDist)))));
                        var yAnimation = new DoubleAnimation(yDist, new Duration(new TimeSpan(0, 0, 0, 0, Math.Abs((int)(yDist)))));
                        var translate  = new TranslateTransform();
                        tempCell.RenderTransform = translate;
                        var transformName = $"TranslateTransform{i}{j}";
                        transformNames.Add(transformName);
                        RegisterName(transformName, translate);
                        Storyboard.SetTargetName(xAnimation, transformName);
                        Storyboard.SetTargetName(yAnimation, transformName);
                        Storyboard.SetTargetProperty(xAnimation, new PropertyPath(TranslateTransform.XProperty));
                        Storyboard.SetTargetProperty(yAnimation, new PropertyPath(TranslateTransform.YProperty));
                        storyBoard.Children.Add(xAnimation);
                        storyBoard.Children.Add(yAnimation);
                    }
                }
            }
            //将动画的起点全部归 0。
            _viewModel.PreUpdate(transformations);
            await storyBoard.BeginAsync(this);

            //动画播放完毕后,更新。
            _viewModel.Update();
            storyBoard.Children.Clear();
            ProcessEggAnimation(transformations);
            //清理掉新的 GridCell。
            foreach (Grid grid in gridsHaveTempCell)
            {
                var children = grid.Children;
                children.RemoveRange(1, children.Count - 1);
            }
            foreach (var name in transformNames)
            {
                UnregisterName(name);
            }
            transformNames.Clear();
            gridsHaveTempCell.Clear();
        }