【问题标题】:ListBox that loads/unloads items when needed需要时加载/卸载项目的列表框
【发布时间】:2016-09-20 14:37:33
【问题描述】:

我有一个ListBox 绑定到一个自定义对象的大型集合,其中包含一个Bitmap。

目前我遇到了内存问题,因为所有位图都已加载,即使它们不可见。

我希望ListBox 以某种方式通知我的模型,以便我可以根据需要按需加载/卸载位图,以避免加载所有位图。因此,仅但仅加载在 ListBox 范围内可见的位图。

我该怎么做?

【问题讨论】:

  • 虚拟化应该有助于提高速度和回收利用。您也可以只将少数项目添加到您的收藏中并处理滚动更改,当滚动条点击按钮然后加载添加另外一些到您的列表等等。
  • 他们是共享图像吗?即使可见性设置为折叠状态也会加载吗?
  • 虚拟化不会避免将整个集合绑定到列表框的内存中!
  • @Natxo 每个位图都是不同的,在运行时生成。 ListBox 中可能有大约 5000 个项目。

标签: c# .net wpf xaml bitmap


【解决方案1】:

如果您为集合中的每个项目检查ItemContainerGenerator.ContainerFromItem,如果项目不在视野范围内并且启用了虚拟化,它应该返回null。

或者

来自Get ListView Visible items:

  • 获取 ListView 的 ScrollViewer(使用 FindDescendant 方法,您可以使用 VisualTreeHelper 自行完成)。
  • 读取它的 ScrollViewer.VerticalOffset :它是显示的第一个项目的编号
  • 读取它的 ScrollViewer.ViewportHeight :它是显示的项目数。

Rq : CanContentScroll 必须为真。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    相关资源
    最近更新 更多