【发布时间】:2012-10-25 08:04:45
【问题描述】:
我面临一个大问题:在我的 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 秒钟。
我尝试了Dispatcher、BackgroundWorker 并遇到了与以前的代码相同的问题。
我尝试将我的动画放在一个弹出窗口上,甚至放在一个透明的新窗口上。没什么可做的,它总是在停止之前冻结 1 秒钟......
对于信息,我使用ObservableCollection(我尝试过使用列表,同样的问题),我在MainWindow 的ContentControl 内加载不同的屏幕。
我看过 techdays 的视频,速度与激情,我真的很想获得像视频中那样流畅的动画,但冻结似乎无法消除。
【问题讨论】:
-
你没有提供足够的细节来确定,但是如果你向视图抛出 notifypropertychanged 事件,这些将由主线程处理。所以如果你使用线程来完成工作,但仍然通知更改,主线程仍然会处理这些并被它占用。
-
您将 ObservableCollection 绑定到哪些控件?你是如何绑定的?如果不绑定,问题会消失吗?我知道如果不显示数据,该应用程序将毫无用处。这是为了隔离是否是渲染问题。
标签: wpf multithreading animation freeze