LongListSelector的Item里使用Image加载网络图片必须注意的问题

来源:互联网 发布:基因表达式编程 编辑:程序博客网 时间:2024/06/03 13:53

当一个列表的Item数很多时,为了效率与节省资源,我们不得不使用LongListSelector,它只保存了当前可见Item数的UI内存,当列表滑动时,比如Item1的位置滑动后显示的是Item10,它直接把Item1对应UI控件的DataContext从Item1直接变成tem10,也就是说UI控件依然是Item1的UI控件,避免了重新创建UI控件的资源开销。

假如ItemTemplate里用到了Image,然后将它的Source绑定到Item的ImageUrl属性,让它自动加载网络图片,这是常用做法,不会有什么问题。

但是,如果你还给这个Image注册了事件的话,比如你想注册ImageFailed事件在加载失败时显示本地的一张加载失败图片,问题就来了,你会发现各种图片错乱事件,应该加载正常的图片却显示了加载失败图片等……。原因就是列表滚动时Image的DataContext已经变化了,比如Item1的Image加载失败响应事件ImageFailed时,实际它的DataContext已经是Item10,你在事件里把Image显示加载失败图片时,实际是显示在了当前的Item10的Image上,就造成了图片错乱事件。

所以只能避免使用注册事件来显示加载失败图片,比如多放一个Image2在相同位置显示加载失败图片,在Image加载网络图片成功时显示在了Image2的前面,看起来像是Image2从加载失败图片变成了网络图片。

0 0