WPF ListBox загружает много фотографий. Будет ли System.IO.IOException возникать в PresentationCore.dll?

Мой ItemTemplate очень простой, один TextBlock для отображения Имя, другой Image для отображения Чистое изображение:

<ListBox.ItemTemplate>
    <DataTemplate>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width = "Auto"/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
            <Image VerticalAlignment = "Center" Source = "{Binding Url, Mode=OneWay, Converter = {StaticResource cvtImage}}" Width = "30" Height = "30"/>
            <TextBlock Grid.Column = "1" Text = "{Binding Name, Mode=OneWay}" Margin = "5" VerticalAlignment = "Center"/>
        </Grid>
    </DataTemplate>
</ListBox.ItemTemplate>

Вот мой массив изображений:

private int[] numArr =
{
    20333581,
    65476272,
    65494751,
    67810732,
    72685857,
    73794129,
    74292128,
    78448608,
    89297529,
    109457648,
    128775798,
    136864278,
    140889893,
    155315730,
    155707244,
    158590544,
    160382605,
    162265810,
    167648987,
    170883246,
    175708510,
    181177782,
};

private List<ImageItem> imagesList = new List<ImageItem>();
private int imageCount = 22;


private void initialImageList()
{
    for (int i = 0; i < imageCount; i++)
    {
        imagesList.Add(new ImageItem {
            Name = "item " + (i + 1).ToString(),
            Url = String.Format("https://p.qlogo.cn/gh/{0}/{0}_1/40", numArr[i], numArr[i])
        });
    }
}

Сетевые изображения выше действительны. Класс ImageItem простой с двумя свойствами: Name и Url Вот мой класс преобразователь:

class GcToNetImageConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var url = (string)value;
        Console.WriteLine("url is " + url);
        try
        {
            return new BitmapImage(new Uri(url));
        }
        catch (Exception ex)
        {
            Console.WriteLine("ex message: {0}", ex.Message);
            return new BitmapImage();
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

После настройки lb.ItemsSource = this.imagesList;, когда вы скользите вниз по ListBox, вы обязательно получите IOException.

Я предполагаю, что это что-то с утечкой памяти

Можете ли вы опубликовать конвертер cvtImage, пожалуйста?

richej 05.03.2019 07:49

@richej Я разместил конвертер

pigLoveRabbit520 05.03.2019 07:57

Проблема с номером 170883246. Понятия не имею, что с ним не так.

richej 05.03.2019 08:13

@richej нет, я могу получить https://p.qlogo.cn/gh/170883246/170883246_1/40 изображение

pigLoveRabbit520 05.03.2019 08:23

да, я знаю, но это все равно вызывает проблему. При удалении работает. Я понял это, сначала загрузив все байты изображения, а затем преобразовав byte[] в растровое изображение. Этот последний шаг не работает для этого конкретного изображения.

richej 05.03.2019 08:30

@richej, вы правы, это вызывает проблему, возможно, его нельзя преобразовать в Bitmap. И как решить эту проблему? любой хороший совет?

pigLoveRabbit520 05.03.2019 08:57
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
30
1

Ответы 1

Я использую этот код для захвата исключения:

try 
{
    var c = new WebClient();
    var bytes = c.DownloadData(url);
    var ms = new MemoryStream(bytes);

    var bi = new BitmapImage();
    bi.BeginInit();
    bi.StreamSource = ms;
    bi.EndInit();

    return bi;  
}
catch (Exception ex)
{
    Console.WriteLine("ex message: {0}", ex.Message);
    return new BitmapImage();
}

теперь я могу получить исключение, но я все еще не могу показать изображение https://p.qlogo.cn/gh/170883246/170883246_1/40. Изображение может быть показано в веб-браузере. Я не понимаю, почему DotNet BitmapImage не может его использовать.

Другие вопросы по теме