123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- using System;
- using System.ComponentModel;
- using System.Linq;
- using System.Threading;
- using System.Windows.Media.Imaging;
- namespace InABox.WPF
- {
- public class ProgressSection
- {
- public ProgressSection(string message, Action action)
- {
- Message = message;
- Action = action;
- }
- public string Message { get; set; }
- public Action Action { get; set; }
- }
- public static class Progress
- {
- private static ProgressForm form;
- public static BitmapImage DisplayImage { get; set; }
- public static bool IsVisible => form != null;
- public static string Message => form?.GetMessage();
- public static void ShowModal(params ProgressSection[] sections)
- {
- if (!sections.Any())
- return;
- var progress = new ProgressForm();
- progress.DisplayImage = DisplayImage;
- progress.Activated += (_, args) =>
- {
- progress.Dispatcher.Invoke(() =>
- {
- foreach (var section in sections)
- {
- progress.Progress.Content = section.Message;
- section.Action();
- }
- progress.Close();
- });
- };
- progress.ShowActivated = true;
- progress.ShowDialog();
- }
- private static void RunShowModal(ProgressForm progress, Action<IProgress<string>> work)
- {
- }
- /// <summary>
- /// Shows progress dialog modally, with a cancel button.
- /// </summary>
- /// <param name="message"></param>
- /// <param name="cancelButtonText"></param>
- /// <param name="work"></param>
- /// <returns>Whether the progress was completed without cancelling.</returns>
- public static bool ShowModal(string message, string cancelButtonText, Action<IProgress<string>, CancellationToken> work)
- {
- var cancellationTokenSource = new CancellationTokenSource();
- var progress = new ProgressForm(cancelButtonText)
- {
- DisplayImage = DisplayImage
- };
- progress.Progress.Content = message;
- progress.Loaded += (_, args) =>
- {
- var worker = new BackgroundWorker();
- var update = new Progress<string>(data => progress.Progress.Content = data);
- progress.OnCancelled += () =>
- {
- cancellationTokenSource.Cancel();
- progress.Close();
- };
- worker.DoWork += (o, e) => work(update, cancellationTokenSource.Token);
- worker.RunWorkerCompleted +=
- (o, e) => progress.Close();
- worker.RunWorkerAsync();
- };
- progress.ShowDialog();
- return !cancellationTokenSource.IsCancellationRequested;
- }
- public static void ShowModal(string message, Action<IProgress<string>> work)
- {
- var progress = new ProgressForm
- {
- DisplayImage = DisplayImage
- };
- progress.Progress.Content = message;
- progress.Loaded += (_, args) =>
- {
- var worker = new BackgroundWorker();
- var update = new Progress<string>(data => progress.Progress.Content = data);
- progress.OnCancelled += () =>
- {
- worker.CancelAsync();
- };
- worker.DoWork += (o, e) => work(update);
- worker.RunWorkerCompleted +=
- (o, e) => progress.Close();
- worker.RunWorkerAsync();
- };
- progress.ShowDialog();
- }
- public static void Show(string message)
- {
- if (form == null)
- {
- form = new ProgressForm();
- form.DisplayImage = DisplayImage;
- form.Show();
- }
- form.UpdateWindow(message);
- }
- public static void SetMessage(string message)
- {
- form.UpdateWindow(message);
- }
- public static void Close()
- {
- form?.CloseWindow();
- form = null;
- }
- }
- }
|