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);
    }

提前致谢

ProgressBar with BackgroundWorker in WPF

定义BackgroundWorker时,启用报告进度:

worker.WorkerReportsProgress = true;
worker.ProgressChanged += _printWorker_ProgressChanged;

向窗口添加ProgressBar。将Maximum设置为要报告的"更新"数量:

<ProgressBar x:Name="ProgressBar1" Maximum="8" />

然后,在 DoWork 事件中的每一行代码之后,通过 BackgroundWorker.ReportProgress 方法增加ProgressBarValue

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 或其他东西来向用户指示应用程序当前正在运行。