UI刷新冻结app同时绘制

时间:2011-09-05 14:11:26

标签: wpf paint freeze ui-thread

这是一个推测性问题,因此没有提供代码。

我有一个应用程序,它接受一个大型XML文件并从中构建一个视图供用户编辑。 XML的加载在后台工作程序中执行,然后通过树视图以漂亮的vanilla MVVM方式绑定到视图。

这一切都很好用,并且在worker加载XML时会显示一个很好的等待光标。

但是,当XML文件变得非常大(20M)时,UI将在绘制新视图期间挂起。这是可以预料的,但它确实意味着应用程序仍处于活动状态的所有视觉提示,也会冻结。一旦在油漆之前的工人中完成加载,光标就会被更改。是否有一个'paintingHasFinished'类型的事件用于控制或漂亮的技巧,我可以用作句柄,所以我可以在这个UI操作后更改我的等待光标?

2 个答案:

答案 0 :(得分:1)

您可以使用调度程序逐个添加您创建的ViewModel或批量生成的ViewModel,以便逐渐添加项目,并且在加载操作结束时不会使度量/布局线程超载。这将增加总体加载时间,但也会增加用户体验。

还要确保打开虚拟化(在数据网格上虚拟化堆栈面板或列/行虚拟化),这将显着提高大型数据集的性能。

答案 1 :(得分:1)

您可以使用Dispatcher找出View完成呈现的时间。

尝试添加此内容:

this.Dispatcher.BeginInvoke(DispatcherPriority.Loaded, new Action(() =>
    {
        Cursor = Cursors.Arrow;
    }
));

这挂钩到调度程序,要求它在使用异步调用完成加载时调用回调。提供的匿名操作将被调用,并应将光标恢复正常。