我开发了一个wpf应用程序来加载listbox中的图像。要加载300mb图像需要时间。我听说要在列表框中加载图像更快,我们必须使用observablecollection,但我不知道如何使用那个。 任何建议PLZ .. 提前致谢
答案 0 :(得分:2)
ObservableCollection可以像List一样使用。但它无法帮助加快图像加载......
您应该做的是将ListBox绑定到包含图像的ObservableCollection,并在单独的线程中使用图像填充集合。通常无法从另一个线程修改绑定集合,但我写了一个AsyncObservableCollection类来处理这个问题。
答案 1 :(得分:2)
如果您要添加/删除/替换集合中的项目并期望UI自动更新这些更改,则只需要ObservableCollection。也就是说,ObservableCollection对托马斯或安迪建议在后台线程中加载是完美的。
这是另一种值得一提的可能性,尽管它有局限性。 ListBox仅为当前滚动到视图中的列表项创建UI元素。如果列表框中一次只能看到少量图像,而其他图像将全部滚动到视图之外,那么您可以利用这一点,让ListBox只是延迟加载图像。
为此,您不会将实际图像对象放在ListBox中。相反,你会放置一些可以按需加载图像的东西。如果您从磁盘或Web加载图像,列表可能包含Uris。如果您正在做一些比如从Web服务加载更漂亮的事情,那么该列表可能包含具有延迟加载图像的Image属性的类的实例。
然后将您的集合(任何列表,不一定是ObservableCollection)绑定到ListBox,并将ItemTemplate设置为构造相应UI并绑定到Uri或延迟加载Image属性的DataTemplate。
上行:简单。无需编写线程代码。
下行:这将取决于数据量,但这可能会使滚动速度变慢,因为在您开始滚动之前,后续图像将无法加载。另外,正如我所指出的,如果大多数图像在首次显示时都适合ListBox,那么这对你来说不会有太大的帮助,并且线程化将是一个更好的答案。 Uri有一个很大的问题,因为一旦你向下滚动,ListBox将丢弃它为第一个项目加载的图像,因此向上滚动就像向下滚动一样慢(尽管是一个自定义类一个懒惰的加载属性会解决这个问题。)
答案 2 :(得分:1)
将图片移动到ObservableCollection
只会神奇地让他们加载速度更快。可能花费这么长时间的是从磁盘加载图像数据。您应该将其移动到后台线程,以便在加载图像数据时不会挂起主UI线程。请考虑使用BackgroundWorker或Dispatcher,这样您就不必自己编写所有线程代码。