ProgressBar with BackgroundWorker in WPF
本文关键字:WPF in BackgroundWorker with ProgressBar | 更新日期: 2023-09-27 17:56:37
我有一个WPF应用程序,其中一项任务是打印一个需要一点时间的telerik报告。
我已经通过使用BackgroundWorker解决了屏幕冻结问题,但是我想在进度条中显示打印过程,我已经阅读了一些示例,但是它们都谈到了FOR循环并将整数传递给进度条,这不适用于我的情况。
如果可能的话,我该怎么做?
这是我的BackgroundWorker DoWork:
void _printWorker_DoWork(object sender, DoWorkEventArgs e)
{
_receiptReport = new Receipt(_invoice.InvoiceID, _invoice.ItemsinInvoice.Count);
printerSettings = new System.Drawing.Printing.PrinterSettings();
standardPrintController = new System.Drawing.Printing.StandardPrintController();
reportProcessor = new Telerik.Reporting.Processing.ReportProcessor();
reportProcessor.PrintController = standardPrintController;
instanceReportSource = new Telerik.Reporting.InstanceReportSource();
instanceReportSource.ReportDocument = _receiptReport;
reportProcessor.PrintReport(instanceReportSource, printerSettings);
}
提前致谢
定义BackgroundWorker
时,启用报告进度:
worker.WorkerReportsProgress = true;
worker.ProgressChanged += _printWorker_ProgressChanged;
向窗口添加ProgressBar
。将Maximum
设置为要报告的"更新"数量:
<ProgressBar x:Name="ProgressBar1" Maximum="8" />
然后,在 DoWork
事件中的每一行代码之后,通过 BackgroundWorker.ReportProgress
方法增加ProgressBar
的Value
:
void _printWorker_DoWork(object sender, DoWorkEventArgs e)
{
var worker = (BackgroundWorker)sender;
worker.ReportProgress(0);
_receiptReport = new Receipt(_invoice.InvoiceID, _invoice.ItemsinInvoice.Count);
worker.ReportProgress(1);
printerSettings = new System.Drawing.Printing.PrinterSettings();
...
...
worker.ReportProgress(6);
instanceReportSource.ReportDocument = _receiptReport;
worker.ReportProgress(7);
reportProcessor.PrintReport(instanceReportSource, printerSettings);
worker.ReportProgress(8);
}
private void _printWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
ProgressBar1.Value = e.ProgressPercentage;
}
您还需要在调用 RunWorkerAsync()
之前使ProgressBar
可见,然后将其隐藏在RunWorkerCompleted
事件中。
您必须为后台工作线程的 ProgressChanged 事件提供一个事件处理程序。但是,您需要有一些数字传递给该事件以指示完成百分比,否则它对于更新进度条不是很有用。
我的建议是只有一个动画 gif 或其他东西来向用户指示应用程序当前正在运行。