4

我面临一个大问题:在我的 WPF 应用程序中,MainWindow 包含一个带有加载动画(故事板)的边框。默认情况下它是折叠的。当我加载大量数据或加载新的 XAML 屏幕时,有时会使其可见并折叠。

首先,我根本没有使用线程和动画,其中既冻结又出现迟到。

然后我开始像这样使用线程:

Messenger.StartAnimation();
var task = Task.Factory.StartNew(() =>
                {
                    Thread.Sleep(150);
                }).ContinueWith((a) =>
                {
                    // HERE Screen moving + large amount of data loaded with Entity Framework
                    Thread.Sleep(200);

                    Messenger.StopAnimation();
                }, CancellationToken.None, TaskContinuationOptions.NotOnFaulted, threadUIContext);

这一次,动画在 1 秒内工作,然后它只是冻结,直到加载所有数据和新显示的屏幕。A 就像主线程阻塞所有线程一样。

我尝试将 Timer 添加到延迟Messenger.StopAnimation()3 秒后。当一切都被改变并加载到我的新屏幕上时,即使这样我的动画也会冻结 1 秒钟,然后我的动画会持续 3 秒钟。

我已经尝试过DispatcherBackgroundWorker并且遇到了与以前的代码相同的问题。

我试图将我的动画放在一个弹出窗口上,甚至放在一个透明的新窗口上。没什么可做的,它总是在停止之前冻结 1 秒钟......

对于信息,我使用ObservableCollection(我尝试过使用 List,同样的问题)并且我ContentControl在我的MainWindow.

我看过 techdays 的视频,速度与激情,我真的很想得到一个像视频一样流畅的动画,但冻结似乎无法消除。

4

2 回答 2

1

在一个简单的集合视图中加载 50 多个小图像时,我遇到了同样的问题。我最终发现,将位图绘制到屏幕上的 .NET Framework 是连接主线程的原因,而我完全没有办法绕过它。我尝试将所有元素放在视图中,但慢慢填充绑定到视图的集合,但是每次可观察集合发生更改时,.NET Framework 都会重新绘制视图中的所有图像,所以这也无济于事。

我询问了一位微软工程师,他直言不讳地承认这是 .NET Framework 中的一个问题,将来必须由微软来解决。我的一位同事说,您可以通过自己使用自己的算法绘制所有像素来规避这个问题。

我想如果你想解决这个问题,你将不得不改变你的数据显示方式,尽管我无法帮助你解决这个问题。

于 2012-11-05T13:27:28.430 回答
0

我们和 Jack 有同样的问题,ListView 绑定到 ObservableCollection。经过大量分析,我们认为是排序和分组过程很慢,而不是数据库查询。最后我们实现了一个单独的线程,但当然必须调用调度程序进行排序和分组,这会将长时间运行的操作放回主 UI 线程 - 所以这似乎淹没了我们漂亮的“正在加载..”动画 - 出现让用户挂起和生涩 - 这根本不是我们想要的......正如 Akku 所说,除了改变数据的显示方式之外,我没有看到解决方案。

于 2013-02-19T07:27:08.993 回答