0
我在本地获取一些数据,实际的读取过程非常快。可以说,因此我有几个ms后有一个列表。虚拟化数据访问
当我将某些项目控件(Ex ListBox)绑定到此数据时,数据显示在项目控件上需要一些时间。例如,如果我在List中有100个项目,则在ListBox中显示的项目大约需要10秒。多多益善。
主要问题是数据显示。每个项目都有一个图像路径。所以,当Itemtemplate被执行时,它会将图像缩小到预定义的大小并显示它。因此,图像缩小的CPU时间越多,UI的响应时间就越多。
<DataTemplate x:Key="itemTemplate">
<StackPanel>
<Image Width="48" Height="48">
<Image.Source>
<BitmapImage DecodePixelWidth="48" UriSource="{Binding ImagePath}" />
</Image.Source>
</Image>
</StackPanel>
</DataTemplate>
为了使UI响应,我使用Rx移动了异步线程上的图像解码,并且工作正常。然而,由于这是一个简单的项目(单个exe),我会尽量避免使用Rx来完成这项任务。那么,如何在没有Rx的情况下做到这一点?
list.ToObservable(Scheduler.Default)
.Buffer(5)
.ObserveOn(SynchronizationContext.Current)
.Subscribe(data =>
{
foreach (var item in data)
UIList.Add(item);
}, null, null);
冒着明显的风险,你检查了WPF可视化器,以确保你的ListBox实际上是虚拟化的项目? –
@MarkFeldman我们应该经常在我们的生活中冒一点风险,对吧? :)风格阻碍了虚拟化,所以请用相同的建议写一个答案,以便我能接受它。 :) – Goran
谢谢戈兰。我自己曾多次被这个人咬过,在WPF中打破虚拟化非常容易。 –