using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.ComponentModel; using connor_zwcadm.util; namespace connor_zwcadm.dialog { public class KBackgroundWorker { public BackgroundWorker backgroundWorker { get; } private Window parent; public KProgressBar pbDialog; public string CompleteMessage { get; set; } public KBackgroundWorker(string completeMessage=null, Window parent = null) { this.parent = parent; this.CompleteMessage = completeMessage; //可以返回工作进度 backgroundWorker = new BackgroundWorker(); backgroundWorker.WorkerReportsProgress = true; //允许取消 backgroundWorker.WorkerSupportsCancellation = true; backgroundWorker.RunWorkerCompleted += backgroundWorker_RunWorkerCompleted; //更新进度条 backgroundWorker.ProgressChanged += backgroundWorker_ProgressChanged; } public void Start(object param, bool disableCancel = true) { if (backgroundWorker.IsBusy) { return; } if (parent != null) { parent.IsEnabled = false; } pbDialog = new KProgressBar(backgroundWorker); if (disableCancel) { pbDialog.tb_cancel.Width = 0; pbDialog.tb_cancel.Visibility = Visibility.Hidden; } backgroundWorker.RunWorkerAsync(param); } public bool IsCancel() { return backgroundWorker.CancellationPending; } private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { pbDialog.Dispatcher.Invoke(new Action(delegate { pbDialog.Close(); })); if (parent != null) { parent.IsEnabled = true; } if (e.Error != null) { KUtil.LogErr(e.Error); ZwSoft.ZwCAD.ApplicationServices.Application.ShowAlertDialog(e.Error.Message); } else { if (e.Cancelled) { ZwSoft.ZwCAD.ApplicationServices.Application.ShowAlertDialog("已取消"); } else if(!string.IsNullOrWhiteSpace(CompleteMessage)) { ZwSoft.ZwCAD.ApplicationServices.Application.ShowAlertDialog(CompleteMessage); } } } private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) { pbDialog.Dispatcher.Invoke(new Action(delegate { pbDialog.progressBar.Value = e.ProgressPercentage; })); } public void Progress(string text, string detail, int progress) { pbDialog.Dispatcher.Invoke(new Action(delegate { pbDialog.l_MainProgress.Content = text; pbDialog.l_SubProcess.Content = detail; })); if (progress >= 0) { backgroundWorker.ReportProgress(progress); } } public void Progress(string text, int progress) { Progress(text, text, progress); } public void ProgressDetail(string text) { pbDialog.Dispatcher.Invoke(new Action(delegate { pbDialog.l_SubProcess.Content = text; })); } public void Progress(string text, int index, int limit) { Progress(text, (index + 1) * 100 / limit); } } }