我有一个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);
}
提前致谢
答案 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动画或其他东西来向用户表明应用程序当前正在运行。