2012-11-05 119 views
4

我面臨着一個大問題:在我的WPF應用程序中,MainWindow包含帶加載動畫(Storyboard)的邊框。默認情況下它已摺疊。當我加載大量數據或加載新的XAML屏幕時,我有時會將其顯示爲可見並摺疊。即使我使用新線程,WPF動畫也會凍結

首先,我沒有使用線程和動畫,其中都凍結和出現與lates。

然後我就開始使用線程這樣的:

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就像主線程阻塞所有線程一樣。

我試着添加計時器來延遲我的Messenger.StopAnimation()到3秒鐘後。即使這樣,當我的新屏幕上的所有內容都被更改並加載後,我的動畫會持續1秒鐘,然後我的動畫會持續3秒。

我試過DispatcherBackgroundWorker並遇到了與以前的代碼相同的問題。

我試圖把我的動畫放在彈出窗口中,甚至是透明的新窗口。無關,它總是最終停止之前凍結1秒......

有關信息,我用ObservableCollection(我試着名單,同樣的問題)和我在MainWindow加載ContentControl內不同的屏幕。

我看過Techdays視頻,速度與激情,我真的很想在視頻上看到流暢的動畫,但凍結似乎無法刪除。

+0

你沒有給出足夠的細節來確定知道,但是如果你將notifypropertychanged事件扔到視圖中,這些將由主線程處理。所以,如果你使用線程來完成工作,但仍然通知變化,主線程仍然會處理這些變量並被它佔用。 – Geerten

+0

您將ObservableCollection綁定到哪些控件?你有什麼約束力?如果你不綁定,問題就會消失嗎?我知道沒有顯示數據的應用程序是沒有用的。這是爲了隔離它是否是渲染問題。 – Paparazzi

回答

1

當在簡單的集合視圖中加載50個以上的小圖像時,我遇到了同樣的問題。我最終發現,.NET Framework將位圖繪製到屏幕上是關係到主線程的原因,而且我絕對沒有辦法規避這種情況。我嘗試將視圖中的所有元素都放入視圖中,但緩慢地填充了綁定到視圖的集合,但每當可觀察集合發生更改時,.NET Framework都會將視圖中的所有圖像重新繪製,因此這也無濟於事。

我問了一位微軟工程師這件事,他直言不諱地承認,這是.NET Framework中的一個問題,將來微軟必須修復這個問題。我的一位同事說你可以用自己的算法自己繪製所有像素來避開這個問題。

我想如果你想解決這個問題,你將不得不改變你的數據顯示方式,儘管我不能幫你解決這個問題。

+0

您可以通過使用WriteableBitmap來修復此問題,並在一個較大的位圖中繪製所有單個位圖,如果發生更改,則僅更改大部分位圖的相應部分,而不是爲該特定區域添加一個髒點。 MainThread只會重繪dirtyrect。 – Geerten

+0

這完全不是關於什麼問題。這關乎.NET控件更新的速度。另外,我使用控件的原因(除了每個圖像外,我還有其他許多按鈕和按鈕),但這只是說明了我遇到.NET框架限制的情況。但是,感謝給予-1來說明我的問題環境應該是不同的 - 儘管我仍然認爲我的回答幾乎總結了Fulg在這裏卡住的問題。 – Akku

+0

我剛剛評論了你的問題(因爲我認爲這可能對你有所幫助)。我知道我的評論不是關於這個問題。所以我沒有-1,這是其他人做的。 – Geerten

0

我們遇到了與Jack相同的問題,並將ListView綁定到ObservableCollection。經過大量的分析,我們認爲這是一個緩慢的排序和分組過程,而不是數據庫上的查詢。最後,我們實現了一個單獨的線程,但當然必須調用調度器進行排序和分組,這會將長時間運行的操作重新放回到主UI線程上 - 這看起來似乎已經淹沒了我們漂亮的「加載..」動畫 - 它出現了給用戶掛起來,而不是什麼我們想要的....正如Akku所說,除了改變數據的顯示方式外,我沒有看到解決方案。

相關問題