绑定ImageSource至Image控件不显示,CarouselView切换项复用缓存图片异常
问题原因与解决方案
核心根因
你的问题出在StreamImageSource的流复用逻辑不符合要求:ImageSource.FromStream传入的Func<Stream>委托,需要每次调用时都返回一个全新、指针在起始位置的可读流。你之前的代码将同一个MemoryStream实例反复传入,第一次图片加载完成后,流的读取指针已经移动到末尾,后续再次读取该流时无法拿到任何数据,CachedImage加载失败就会保留上一次成功加载的图片,因此看起来始终显示同一张。
修复方案
推荐你在模型中存储图片二进制数据而非ImageSource,每次需要时动态生成全新的流:
修改模型定义
public class FraseClass : ViewModelBase { private byte[] _imgData; public byte[] ImgData { get => _imgData; set { _imgData = value; RaisePropertyChanged(nameof(ImgData)); RaisePropertyChanged(nameof(ImgSource)); } } // 每次访问都返回新的ImageSource,内置的流都是全新可读的 public ImageSource ImgSource => ImgData == null ? null : ImageSource.FromStream(() => new MemoryStream(ImgData)); }
修改切换逻辑
private void CurrentItemChanged (object sender, CurrentItemChangedItemArgs e) { var currentItem = ListaFrasi[Index]; if (currentItem.ImgData == null) { string LinkImg = "ftp://epiz_27426656@ftpupload.net/htdocs/ImgSfondo/" + DateTime.Now.AddDays(-Index).DayOfYear + ".jpg"; // 注意原代码的WebLcient是拼写错误,应为WebClient byte[] ImgByte = new WebClient().DownloadData(LinkImg); currentItem.ImgData = ImgByte; } ImgFrase.Source = currentItem.ImgSource; }
优化方案(推荐)
你用的ff:CachedImage本身就支持远程资源加载与自动缓存,完全不需要手动写下载逻辑,直接传入Uri即可,实现更简单性能也更好:
简化模型定义
public class FraseClass : ViewModelBase { private Uri _imgUri; public Uri ImgUri { get => _imgUri; set { _imgUri = value; RaisePropertyChanged(nameof(ImgUri)); } } }
简化切换逻辑
private void CurrentItemChanged (object sender, CurrentItemChangedItemArgs e) { var currentItem = ListaFrasi[Index]; if (currentItem.ImgUri == null) { string LinkImg = "ftp://epiz_27426656@ftpupload.net/htdocs/ImgSfondo/" + DateTime.Now.AddDays(-Index).DayOfYear + ".jpg"; currentItem.ImgUri = new Uri(LinkImg); } ImgFrase.Source = currentItem.ImgUri; }
内容的提问来源于stack exchange,提问作者trecchino
相关产品推荐
相关产品推荐

