为长时间运行的方法实现WPF Progressbar

时间:2012-09-18 13:25:20

标签: wpf progress-bar

我们有一个3层架构(UI,BL,DAL)WPF应用程序。我需要处理大量行的WPF和DevExpress数据网格的加载。 BL方法将返回一个可观察的对象集合,这些对象将绑定到WPF数据网格。如果记录的数量很大,则UI变得无响应。因此,我们需要实现一个解决方案,以便在BL方法执行查询并处理数据时显示已完成工作百分比的进度条。在这里,我需要在执行查询时立即获取记录总数,并在处理完每行之后需要显示标签中项目处理的当前索引,如“处理1/2000文档”。

实现上述功能的最佳方法是什么。我们正在使用MVVM模式。我是否需要改变我们提取和处理BL中的记录的方式(目前是BL方法中的fectch和处理(从datareader到自定义对象的Map值))。或者,我正在寻找在用户滚动数据网格时以分页方式加载数据网格中的行。

赞赏任何样品链接。

编辑: @Big Daddy你的解决方案 1)添加新属性以查看模型以获取TotalCount和PercentComplete。 2)将viewmodel传递给Search方法。 3)使用BGW更新属性。

上述似乎是一个可行的解决方案。但我很想知道是否有任何其他解决方法,而不依赖于viewmodel。任何设计模式都可以用于这种操作吗?

2 个答案:

答案 0 :(得分:2)

您可以使用BackgroundWorker来处理此问题。它不会在获取数据时阻止UI,并会保持UI对用户的响应。 BackgroundWorker有一个ProgressChanged事件,可以很好地与ProgressBars一起使用。

在我参与的项目中,我在客户端服务/存储库中实现了BW。您的视图模型可以调用此类。这里的方法将实例化BW,完成工作,报告进度并返回数据。您需要在UI上报告progess,因此在视图模型中设置属性并将ProgressBar的值绑定到它,如下所示:

查看-模型

private int _percentCompleted;
    [DefaultValue(0)]
    public int PercentCompleted
    {
        get { return _percentCompleted; }
        set
        {
            _percentCompleted = value;
            RaisePropertyChanged(() => this.PercentCompleted);
        }
    }

查看

<ProgressBar x:Name="SourceBatchUploadProgressBar"
                         Style="{StaticResource GreenProgressBar}" Grid.Column="1"  Grid.Row="1" 
                         Value="{Binding PercentCompleted, UpdateSourceTrigger=PropertyChanged}" 
                         Height="25" Width="200" Margin="5,0,10,5"/>

您需要让BW的ReportProgress事件更新PercentCompleted属性才能使其生效。像这样:

BackgroundWorker.RunWorkerCompleted += (o, e) =>
        {
            ...Update progress
        };

如果您想了解更多详情,请与我们联系。

答案 1 :(得分:1)

所以你拥有所有的行。你指的是什么处理?渲染?渲染的显示状态始终为100%,因为在渲染完成之前它不会渲染。

UI需要很长时间来渲染2000行。正在进行大量的格式化和大小调整。

将UI拆分为每页显示40行,包含下一页和上一页按钮。

如果DevExpress数据网格不支持虚拟化,那么寻找一个可行的网格。对于速度我喜欢ListView GridView。

哇,检查一下。你在听我给你更多。

因此,如果速度很快,您可以立即获取整个ID列表(并且可以获得总计数)。然后根据需要创建40个对象。如果你想在BackGroundWorker上创建下一个40。启动BackGroundWorker时禁用“下一步”按钮,并在“完成”中启用它。