public void Execute(object parameter) { if (!CanExecute(parameter)) { return; } var nextPresenter = TransitToNextClip(UpcomingClip); if (Presenters.Count == 1) { return; //no previous presenter } var currentPresenter = Presenters[0]; if (nextPresenter.HidesPreviousClip && !currentPresenter.IsInExitSequence) { for (int i = 0; i < Presenters.Count - 1; i++) { if (Presenters[i].IsInExitSequence) { continue; } Presenters[i].ReadyForCrossfade -= Clip_ReadyForCrossfade; if (i == 0) { Presenters[0].ExitSequenceCompleted += Clip_ExitSequenceCompleted; } else { Presenters[i].ExitSequenceCompleted += SubClip_ExitSequenceCompleted; } Presenters[i].StartExitSequence(); } NextClipCommand.RaiseCanExecuteChanged(); } }
/// <summary> /// Accures when a clip that is in exit sequence completes the sequence. Should be removed. /// </summary> /// <param name="sender"></param> void Clip_ExitSequenceCompleted(IClipPresenter sender) { sender.ExitSequenceCompleted -= Clip_ExitSequenceCompleted; Presenters.Remove(sender); if (!sender.HidesPreviousClip && sender == _presenterInFocus && Presenters.Count > 0) { _presenterInFocus = Presenters[0]; CurrentClip = Presenters[0].OriginalClip; } if (sender.HidesPreviousClip) { AdvanceCurrentClip(); } else { AdvanceUpcomingClip(); } NextClipCommand.RaiseCanExecuteChanged(); }
/// <summary> /// Happens when a presenter which his exit sequence was started when he was not Presenters[0], only need /// to remove from presenters. /// </summary> /// <param name="obj"></param> void SubClip_ExitSequenceCompleted(IClipPresenter sender) { sender.ExitSequenceCompleted -= SubClip_ExitSequenceCompleted; Presenters.Remove(sender); NextClipCommand.RaiseCanExecuteChanged(); }