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