private void CheckForOverlap() { var allClips = AnimationTimeline.AnimationTracks.SelectMany(track => track.TrackClips); var allDirtyClips = allClips.Where(clip => clip.Dirty); var anyDirty = allDirtyClips.Count() > 0; if (!anyDirty) { return; } foreach (var clip in allClips) { clip.CrossFade = false; } foreach (var clip in allClips) { var min = clip.StartTime; var max = clip.EndTime; // Get all the clips that the start of this clip overlaps var overlappedClips = allClips.Where(evaluationClip => evaluationClip != clip && (min <evaluationClip.EndTime && min> evaluationClip.StartTime) && max > evaluationClip.EndTime); foreach (var overlapped in overlappedClips) { var overlappingTime = overlapped.EndTime - clip.StartTime; clip.TransitionDuration = overlappingTime; clip.CrossFade = true; } } foreach (var clip in allDirtyClips) { clip.Dirty = false; } AnimationTimeline.Process(AnimationTimeline.Sequence.RunningTime, AnimationTimeline.Sequence.PlaybackRate); }