Ejemplo n.º 1
0
        private static void RunNextAnimation(Timeline timeline, FrameworkElement element)
        {
            var timelineGuid = GetTimelineGuid(timeline);
            var elementGuid  = GetElementGuid(element);
            var active       = _actives.FindActiveTimeline(timelineGuid);

            active.SetAnimationState(timelineGuid, AnimationState.Completed);

            // If an idle animation exists, run it
            if (_actives.GetNextIdleActiveTimeline(elementGuid)?.Settings is AnimationSettings idleSettings)
            {
                RunAnimation(element, idleSettings, runFromIdle: true);
            }

            // Else if the animation is a repetitive sequence and they're all completed,
            // then reset the Completed to be Idle and re-start the sequence
            else if (active.IsSequence && active.IsIterating && _actives.AllIteratingCompleted(elementGuid))
            {
                _actives.ResetAllIteratingCompletedToIdle(elementGuid);

                // Make sure to run the next iteration on visible elements only
                if (element.Visibility == Visibility.Visible)
                {
                    var first = _actives.FindFirstActiveTimeline(elementGuid);
                    RunAnimation(element, first.Settings, runFromIdle: true);
                }
            }

            // Else if the animation needs to repeat, re-start it
            else if (!active.IsSequence && active.IsIterating)
            {
                active.SetAnimationState(timelineGuid, AnimationState.Idle);

                // Make sure to run the next iteration on visible elements only
                if (element.Visibility == Visibility.Visible)
                {
                    RunAnimation(element, active.Settings, runFromIdle: true);
                }
            }

            // Else if it's done animating, clean it up
            else if (active.IterationCount <= 1 && active.IterationBehavior != IterationBehavior.Forever)
            {
                ExecuteCompletionCommand(element, active);
                Cleanup(elementGuid, stopAnimation: false);
            }
        }