我有一个列表框,其中每个项目都包含一个在线下载的图像。
<ListBox.ItemTemplate >
<DataTemplate>
<StackPanel Margin="10" >
<RelativePanel>
<Image ImageFailed="Image_ImageFailed">
<Image.Source>
<BitmapImage UriSource="{Binding IMG1}" />
</Image.Source>
private void Image_ImageFailed(object sender, ExceptionRoutedEventArgs e)
{
((Image)sender).Source = new BitmapImage(new Uri("ms-appx:///assets/StoreLogo.png"));
}
这就是我绑定数据的方式;
data = from query in loadedData.Descendants("item") select new Models.Item
{
IMG1 = "https://example.png",
};
ItemsListBox.ItemsSource = data.Select(grp => grp.FirstOrDefault());
起初它工作正常。但是,当我开始向下和向上滚动时,由于ImageFailed方法,所有图像都被默认图像替换。所以;
为什么列表框会在滚动时尝试重新加载图像?
为什么即使图片网址有效,也会调用ImageFailed?
我是否必须自己缓存图片?
答案 0 :(得分:0)
尝试将IMG1
属性的类型更改为ImageSource
并将其设置为
IMG1 = new BitmapImage(new Uri("https://example.png"))
然后从XAML中删除BitmapImage并直接绑定Image控件的Source
属性:
<Image ImageFailed="Image_ImageFailed" Source="{Binding IMG1}" />
也可以通过调用ToList()
强制立即进行查询评估:
ItemsListBox.ItemsSource = data.Select(grp => grp.FirstOrDefault()).ToList();