在列表框中滚动时调用ImageFailed

时间:2017-01-04 18:49:13

标签: c# uwp

我有一个列表框,其中每个项目都包含一个在线下载的图像。

<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方法,所有图像都被默认图像替换。所以;

  1. 为什么列表框会在滚动时尝试重新加载图像?

  2. 为什么即使图片网址有效,也会调用ImageFailed?

  3. 我是否必须自己缓存图片?

1 个答案:

答案 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();