WPF尝试将远程图像添加到列表视图,但只显示最后一个

时间:2017-12-01 19:00:37

标签: c# wpf listview

我正在尝试在列表视图中加载远程图像,但只有最后一张图像显示在列表中,其余图像不显示。这是代码,我已经删除了顶部代码的一些部分。请注意,代码编译正常,只是远程图像不加载(UI中的最后一个除外)。任何帮助都会很酷!

    public async void button_Click(object sender, RoutedEventArgs e)
    {
        if (youtube_ids.Count > 0)
        {
            DownloadLinks.Visibility = Visibility.Visible;
            foreach (var youtube_id in youtube_ids)
            {

                var grid = new Grid();
                grid.Width = 400;
                grid.Height = 50;



                // image thumbnail
                var thumb = new Image();

                thumb.Width = 50;
                thumb.MaxHeight = 50;
                thumb.Margin = new System.Windows.Thickness { Left = 10 };


                var thumb_file = new BitmapImage(new Uri($"http://img.youtube.com/vi/{youtube_id}/0.jpg", UriKind.Absolute));
                thumb.VerticalAlignment = System.Windows.VerticalAlignment.Center;
                thumb.HorizontalAlignment = System.Windows.HorizontalAlignment.Left;
                thumb_file.DownloadCompleted += (ob, ev) =>
                {
                    thumb.Source = thumb_file;



                };
                grid.Children.Add(thumb);
                DownloadLinks.Items.Add(grid);

            }
        }
    }

我还在缩略图旁边添加了一个按钮,显示正常。这是现在看起来像的截图 screenshot

3 个答案:

答案 0 :(得分:1)

原因是您没有根据上面的代码循环下载缩略图。此外,在下载完成中,尝试使用事件变量而不是依赖于事件外部的变量,因为如果重新分配也会导致问题。

将循环中的下载和网格移到其外部。

答案 1 :(得分:1)

不要在代码后面创建UI元素,而是声明一个合适的ItemTemplate

<ListView x:Name="images">
    <ListView.ItemTemplate>
        <DataTemplate>
            <Image Width="50" MaxHeight="50" Margin="10" Source="{Binding}"/>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

并将一组图像URL字符串分配给ItemsSource属性:

images.ItemsSource = youtube_ids.Select(
    i => string.Format("http://img.youtube.com/vi/{0}/0.jpg", i));

答案 2 :(得分:0)

问题是看起来你有一个名为&#34; grid&#34;这超出了这种方法的范围。正如上面提到的netniV,你不应该出于这个原因。

您只需重新添加之前已添加的相同网格。

您的代码应如下所示:

public async void button_Click(object sender, RoutedEventArgs e)
{
    if (youtube_ids.Count > 0)
    {
        DownloadLinks.Visibility = Visibility.Visible;
        foreach (var youtube_id in youtube_ids)
        {

                var grid = new Grid();
                grid.Width = 400;
                grid.Height = 50;



            // image thumbnail
            var thumb = new Image();

            thumb.Width = 50;
            thumb.MaxHeight = 50;
            thumb.Margin = new System.Windows.Thickness { Left = 10 };


            var thumb_file = new BitmapImage(new Uri($"http://img.youtube.com/vi/{youtube_id}/0.jpg", UriKind.Absolute));
            thumb.VerticalAlignment = System.Windows.VerticalAlignment.Center;
            thumb.HorizontalAlignment = System.Windows.HorizontalAlignment.Left;
            thumb_file.DownloadCompleted += (ob, ev) =>
            {
                thumb.Source = thumb_file;



            };
            grid.Children.Add(thumb);
            DownloadLinks.Items.Add(grid);
        **}**
    }
}