我的应用程序有问题,我不知道它是否正常.
我的应用程序中有一个需要显示大量文本(2000-4000个字符)的文本块.无论如何我有2048像素的限制,所以我的文字被裁剪,这没问题,我用这个: http://blogs.msdn.com/b/priozersk/archive/2010/09/08/creating-scrollable-textblock-for-wp7.aspx.
我的应用程序中有一个需要显示大量文本(2000-4000个字符)的文本块.无论如何我有2048像素的限制,所以我的文字被裁剪,这没问题,我用这个: http://blogs.msdn.com/b/priozersk/archive/2010/09/08/creating-scrollable-textblock-for-wp7.aspx.
问题是文本越长,消耗的内存就越多.如果没有来自上面链接的很长的文本黑客,文本块消耗大约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);
我在创建
Overflow7时遇到了类似的问题
我遇到的问题与如下事实有关:如果你在ScrollViewer中使用StackPanel,那么ScrollViewer坚持要渲染所有的StackPanel,而不仅仅是可见部分.
我读了四遍,有两个一般的解决方案:
>使用UI虚拟化技术 – 例如VirtualizingStackPanel
>使用数据虚拟化技术 – 例如制作自己的分页
为了解决这个问题,我在Overflow7中使用了ListBoxes而不是ScrollViewer / StackPanel组合. ListBox的内部部分使用VirtualizingStackPanel – 这个VirtualizingStackPanel在屏幕上呈现的只是什么,而不是整个可滚动的客户区域.
这有点“hacky”但运作良好.如果你有时间,那么我相信更好的解决方案是改进ScrollableTextBlock实现,以便它使用VirtualizingStackPanel – 有关于如何使用它的好帖子(例如)WPF VirtualizingStackPanel for increased performance