在WPF中使用BackgroundWorker的ProgressBar

时间:2014-04-04 03:16:03

标签: c# wpf backgroundworker

我有一个WPF应用程序,其中此应用程序中的任务之一将打印一个需要一点时间的telerik报告。

我已经通过使用BackgroundWorker解决了屏幕冻结问题,但是我想在ProgressBar中显示打印过程,我已经阅读了一些示例,但是所有这些示例都讨论了FOR循环并将整数传递给ProgressBar,这不适用于我的情况。

如果可能,我怎么能这样做?

这是我的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);
    }

提前致谢

2 个答案:

答案 0 :(得分:3)

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

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

在您的窗口中添加ProgressBar。将Maximum设置为您想要报告的“更新”:

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

然后在Value事件中的每行代码后,通过ProgressBar方法增加BackgroundWorker.ReportProgress的{​​{1}}:

DoWork

您还需要在调用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; } 之前显示ProgressBar,然后将其隐藏在RunWorkerAsync()事件中。

答案 1 :(得分:1)

您必须为后台工作程序提供ProgressChanged事件的事件处理程序。但是,您需要将一些数字传递给该事件以指示完成百分比,或者它对更新进度条不是很有用。

我的建议是只需要一个GIF动画或其他东西来向用户表明应用程序当前正在运行。