Windows phone 7 wp7-文本块包含大量文本-占用大量内存-如何避免?

Windows phone 7 wp7-文本块包含大量文本-占用大量内存-如何避免?,windows-phone-7,Windows Phone 7,我的应用程序有问题,我不知道这是否正常。 我的应用程序中有一个文本块,需要显示大量文本(2000-4000个字符)。无论如何,有2048像素的限制,我想我的文本被裁剪了,这没有问题,我使用这个: 问题是文本越长,消耗的内存就越多。如果没有上面链接的很长的文本攻击,textblock将消耗大约10mb的内存! 如果我使用上面链接中的ScrollableTextBlock,内存量会更大,可以达到30-40MB。。没有限制。 因此,似乎内存使用与绘制的区域有关 有没有办法减少长文本的内存使用?Bitm

我的应用程序有问题,我不知道这是否正常。 我的应用程序中有一个文本块,需要显示大量文本(2000-4000个字符)。无论如何,有2048像素的限制,我想我的文本被裁剪了,这没有问题,我使用这个:

问题是文本越长,消耗的内存就越多。如果没有上面链接的很长的文本攻击,textblock将消耗大约10mb的内存! 如果我使用上面链接中的ScrollableTextBlock,内存量会更大,可以达到30-40MB。。没有限制。 因此,似乎内存使用与绘制的区域有关

有没有办法减少长文本的内存使用?BitmapCach与此问题有关吗?我可以禁用它吗?您只需添加一个包含很长文本的textblock即可轻松重现此问题,您可以使用此代码检查内存使用情况,您将看到,仅使用一个包含长文本的textblock,峰值内存将增加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);

对于单个控件中的大量文本,通常会消耗比预期更多的内存。如前所述,您可以分页文本或实现动态加载,其中仅为可见区域加载文本卡盘。这样,您就不会在内存中保留一个大字符串


在您的情况下,缓存与用户切换到不同页面时的重复使用和内容重新加载有关,而不是与初始内容加载和操作过程有关。

我在创建缓存时遇到了类似的问题

我遇到的问题是,如果在ScrollViewer中使用StackPanel,则ScrollViewer坚持渲染所有StackPanel,而不仅仅渲染可见部分

我四处阅读,发现有两种通用解决方案:

  • 使用UI虚拟化技术-例如虚拟化StackPanel
  • 使用数据虚拟化技术—例如,制作自己的分页
为了在Overflow7中解决这个问题,我使用了列表框而不是ScrollViewer/StackPanel组合。ListBox的内部部分使用VirtualzingStackPanel,而这个VirtualzingStackPanel只呈现屏幕上的内容,而不是整个可滚动的客户端区域


这是一个有点“黑客”,但工作得很好。如果您有时间,那么我相信更好的解决方案是改进ScrollableTextBlock实现,使其使用VirtualzingStackPanel-有很多关于如何在上使用它的帖子(例如)

我知道这是一个老问题,但我想再添加一个解决方案


为了完成我的任务,我将“拆分”逻辑封装到一个单独的类中,该类以字符串列表的形式生成输出。然后,您可以将该列表绑定到您最喜欢的ListBox控件,瞧,您有一个ginormous文本块。分割逻辑已针对性能进行了优化,因此您将获得比Alex的ScrollableTextBlock更好的处理时间。另外,由于您可以将列表绑定到任何支持虚拟化的ListBox控件,因此您的内存占用会保守得多。

您是否想过分页文本,而不是一次显示所有文本?是的,但我想知道这是否正常,是否有解决办法(除了分页)。。这是一个巨大的内存量。为什么不使用WebBrowser控件?因为我正在编写一个应用程序。。。我想如果我想的话,我可以把整个东西放在网络浏览器里。。。