68 lines
2.1 KiB
C#
68 lines
2.1 KiB
C#
|
|
using MwFramework.Controls.Components;
|
|||
|
|
using Stylet;
|
|||
|
|
using System;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.Linq;
|
|||
|
|
using System.Text;
|
|||
|
|
using System.Threading;
|
|||
|
|
using System.Threading.Tasks;
|
|||
|
|
using System.Windows;
|
|||
|
|
using System.Windows.Input;
|
|||
|
|
|
|||
|
|
namespace MainShell.Resources.CustomControl
|
|||
|
|
{
|
|||
|
|
public class LoadingService : PropertyChangedBase
|
|||
|
|
{
|
|||
|
|
public static LoadingService Instance { get; } = new LoadingService();
|
|||
|
|
|
|||
|
|
private bool _isBusy;
|
|||
|
|
private string _message;
|
|||
|
|
private double _progressValue;
|
|||
|
|
private bool _canCancel;
|
|||
|
|
private bool _isIndeterminate = true;
|
|||
|
|
private CancellationTokenSource _cts;
|
|||
|
|
|
|||
|
|
public bool IsBusy { get => _isBusy; set => SetAndNotify(ref _isBusy, value); }
|
|||
|
|
public string Message { get => _message; set => SetAndNotify(ref _message, value); }
|
|||
|
|
public double ProgressValue { get => _progressValue; set => SetAndNotify(ref _progressValue, value); }
|
|||
|
|
public bool CanCancel { get => _canCancel; set => SetAndNotify(ref _canCancel, value); }
|
|||
|
|
public bool IsIndeterminate { get => _isIndeterminate; set => SetAndNotify(ref _isIndeterminate, value); }
|
|||
|
|
|
|||
|
|
// 暴露给外部算法使用的 Token
|
|||
|
|
public CancellationToken Token => _cts?.Token ?? CancellationToken.None;
|
|||
|
|
|
|||
|
|
// 取消命令
|
|||
|
|
public ICommand CancelCommand { get; }
|
|||
|
|
|
|||
|
|
private LoadingService()
|
|||
|
|
{
|
|||
|
|
CancelCommand = new DelegateCommand(() => {
|
|||
|
|
_cts?.Cancel();
|
|||
|
|
Message = "正在取消...";
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void Show(string message, bool isIndeterminate, bool canCancel)
|
|||
|
|
{
|
|||
|
|
_cts = new CancellationTokenSource();
|
|||
|
|
Message = message;
|
|||
|
|
IsIndeterminate = isIndeterminate;
|
|||
|
|
CanCancel = canCancel;
|
|||
|
|
ProgressValue = 0;
|
|||
|
|
IsBusy = true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void Hide()
|
|||
|
|
{
|
|||
|
|
IsBusy = false;
|
|||
|
|
_cts?.Dispose();
|
|||
|
|
_cts = null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void Report(double value) => Application.Current.Dispatcher.BeginInvoke(new Action(() =>
|
|||
|
|
{
|
|||
|
|
ProgressValue = value;
|
|||
|
|
}));
|
|||
|
|
}
|
|||
|
|
}
|