2011-01-31 17 views
3

我的應用程序出現問題,我不知道它是否正常。 我在我的應用程序中需要顯示大量文本(2000-4000字符)的文本塊。無論如何,有2048像素的限制,我認爲我的文字被裁剪,這是沒有問題的,我使用這個:http://blogs.msdn.com/b/priozersk/archive/2010/09/08/creating-scrollable-textblock-for-wp7.aspxwp7 - 帶有大量文本的TextBlock - 巨大的內存使用 - 如何避免它?

問題是,文本越長,它消耗的內存就越多。如果沒有上面鏈接的長文本破解,textblock會消耗大約10mb的內存! 如果我從上面的鏈接中使用ScrollableTextBlock,內存的數量會更大,可以達到30-40 mb ..沒有限制。 因此,內存使用似乎與繪製區域有關...

有沒有辦法減少長文本的內存使用量? BitmapCach與這個問題有什麼關係,我可以禁用它嗎?您可以通過添加一個文本塊很長的文本塊來輕鬆地重現此問題,並且可以使用此代碼檢查內存使用情況,您將看到只有1個帶有長文本的文本塊,峯值內存增加了10mb或更多:

 long deviceTotalMemory = (long)DeviceExtendedProperties.GetValue("DeviceTotalMemory"); 
     long applicationCurrentMemoryUsage = (long)DeviceExtendedProperties.GetValue("ApplicationCurrentMemoryUsage"); 
     long applicationPeakMemoryUsage = (long)DeviceExtendedProperties.GetValue("ApplicationPeakMemoryUsage"); 

     Debug.WriteLine("### deviceTotalMemory    : " + deviceTotalMemory); 
     Debug.WriteLine("### applicationCurrentMemoryUsage : " + applicationCurrentMemoryUsage); 
     Debug.WriteLine("### applicationPeakMemoryUsage : " + applicationPeakMemoryUsage); 
+0

你有沒有想過分頁文本,而不是試圖一次性顯示它? – 2011-01-31 16:25:37

+0

是的,但我想知道這是否正常,以及是否有解決辦法(除了分頁)。這是一個巨大的內存。 – johnX99 2011-01-31 16:51:46

回答

3

創建Overflow7

,當我遇到類似的問題來到我遇到的問題是有,如果你使用一個StackPanel一個的ScrollViewer內,那麼ScrollViewer中堅持認爲,所有StackPanel中的呈現,不只是事實做可見部分。

我看了四周,有2級通用的解決方案:

  • 使用UI虛擬化技術 - 例如VirtualizingStackPanel
  • 使用數據虛擬化技術 - 例如,製作自己的分頁

爲了解決Overflow7中的問題,我使用了ListBox而不是ScrollViewer/StackPanel組合。 ListBox的內部部分使用一個VirtualizingStackPanel - 並且這個VirtualizingStackPanel呈現屏幕上的內容,而不是整個可滾動的客戶區域。

這有點「哈克」,但效果很好。如果你有時間,那麼我相信一個更好的解決方案是改進ScrollableTextBlock實現,以便它使用VirtualizingStackPanel - 有關於如何使用它的好帖子(例如)WPF VirtualizingStackPanel for increased performance

0

對於單個控件中的大量文本,正常情況下會消耗比預期更大的內存量。如前所述,您可以頁面文本或實現動態加載,其中只有可見區域的文本加載。這樣你就不會在內存中保留大字符串。

就你而言,只要用戶切換到不同的頁面,而不是初始的內容加載和操作過程,高速緩存將與重新使用和內容重新加載有關。

0

我知道這是一個老問題但是我想添加一個解決方案。

http://blogs.msdn.com/b/stankovski/archive/2013/08/27/yet-another-scrollable-textblock-for-windows-phone.aspx

要完成我的任務我都封裝在「分裂」成邏輯產生的輸出字符串列表的單獨的類。然後,您可以將該列表綁定到您最喜歡的ListBox控件,並且瞧,你有一個巨大的文本塊。分離邏輯已經針對性能進行了優化,因此您可以通過Alex獲得比ScrollableTextBlock更好的處理時間。此外,由於您可以將列表綁定到支持虛擬化的任何ListBox控件,因此您將擁有更保守的內存佔用空間。

相關問題