private void AddProgressItem(Window window, IProgressItemViewModel <T> itemViewModel) { var viewModel = (ProgressViewModel)window.DataContext; viewModel.ProgressItems.Add(itemViewModel); var cleanup = new DisposeManager(); cleanup.AddEvent(h => itemViewModel.Completed += h, h => itemViewModel.Completed -= h, (EventHandler)((s, e) => HandleCompletedOrCanceled(cleanup, window, viewModel, itemViewModel, true))); cleanup.AddEvent(h => itemViewModel.Canceled += h, h => itemViewModel.Canceled -= h, (EventHandler)((s, e) => HandleCompletedOrCanceled(cleanup, window, viewModel, itemViewModel, false))); }
private void StartDialog(IProgressItemViewModel <T> itemViewModel) { DispatcherViewFactory.InvokeAsync("Secondary GUI", () => { var window = _window; if (window == null) { window = _window = PrepareProgressView(); AddProgressItem(window, itemViewModel); window.Closing += HandleWindowClosing; window.Show(); } else { AddProgressItem(window, itemViewModel); } }).ConfigureAwait(false); }
private bool CanResume(IProgressItemViewModel item) { return(item != null && item.ResumeCommand.CanExecute(null)); }
private void HandleResume(IProgressItemViewModel item) { item.ResumeCommand.TryExecute(null); }
private void HandlePause(IProgressItemViewModel item) { item.PauseCommand.TryExecute(null); }
private void HandleCompletedOrCanceled(DisposeManager cleanup, Window window, ProgressViewModel viewModel, IProgressItemViewModel <T> itemViewModel, bool isCompleted) { cleanup.Dispose(); window.Dispatcher.CheckedInvoke(() => { viewModel.ProgressItems.Remove(itemViewModel); if (viewModel.ProgressItems.Count == 0) { Task.Delay(1000); if (_window != null && _window.IsVisible) { viewModel.OkCommand.TryExecute(null); } _window = null; var result = new AsyncActivityResult <IProgressItemViewModel <T> >(isCompleted, itemViewModel); Completion.TrySetResult(result); } }); }