我在CoverView(基于列表框创建)控件中添加了大量图片
信息太多时我有问题。添加的图像不会同时显示。我必须等到搜索并添加完成后才能知道加载图像需要花费时间。我还尝试通过减少像素来加快加载速度,但应用程序挂起
如何在不停止程序的情况下立即显示图像?
这是我的视图模型
public class ImageData
{
public string Name { get; set; }
public ImageSource ImageSource { get; set; }
}
public async Task LoadFolder(CancellationToken ct)
{
foreach (var path in Directory.EnumerateFiles(DataPath, "*.jpg"))
{
if (!ct.IsCancellationRequested)
{
Images.Add(new ImageData
{
Name = path,
ImageSource = await LoadImage(path)
});
}
}
}
public Task<BitmapImage> LoadImage(string path)
{
return Task.Run(() =>
{
var bitmap = new BitmapImage();
using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read))
{
bitmap.BeginInit();
bitmap.DecodePixelHeight = 100;
bitmap.CacheOption = BitmapCacheOption.OnLoad;
bitmap.StreamSource = stream;
bitmap.EndInit();
bitmap.Freeze();
}
return bitmap;
});
}
我这样称呼它
await ((ViewModel)DataContext).LoadFolder(ts.Token);
我也尝试过 IsAsync ,它的性能有所改善,但是程序继续挂起并起床很晚
<CoverView ItemsSource="{Binding Images, IsAsync=True}"/>
答案 0 :(得分:0)
ImageData应该实现INotifyPropertyChanged
并在ImageSource
属性更改时通知,因为await
稍后会为其提供值。
当绑定属性同步检索数据并使绑定时UI卡住时,IsAsync
是相关的。
另外,图片应为ObservableCollection
类型,因为await
会延迟添加项目。