rp_Faraon
@rp_Faraon

При создании нескольких MemoryStream изображения путаются друг с другом как исправить?

Создаю свой медиа плеер на Maui и при создании списка хотел чтобы изображение музыки выводилось рядом. Использую TagLib чтобы из mp3 легко вывести изображение в инете посмотрел что можно использовать MemoryStream но когда создаю несколько экземпляров MemoryStream изображения путаются друг с другом. Непонятно то что почему это всё путается и почему если я обновлю список музыки изображения поменяются снова или встанут на свои места.

Вот мой код для добавления музыки в лист
void MusicinfsAdd(string PathMsc)
    {
        var filemsc = TagLib.File.Create(PathMsc);
        if (filemsc.Tag.Pictures.Length >= 1) 
        {
            var bin = (byte[])(filemsc.Tag.Pictures[0].Data.Data);
            var ms = new MemoryStream(bin);
            musicinf MusInf = new musicinf { pathtomcs = PathMsc, Artist = filemsc.Tag.FirstAlbumArtist ?? "unknow", MusicName = filemsc.Tag.Title ?? "unknow", MaxTime = Time_Max((int)filemsc.Properties.Duration.TotalSeconds), MusicImg = ImageSource.FromStream(() => ms )};
            Musicinfs.Add(MusInf);
            
        }
        else
        {
            musicinf MusInf = new musicinf { pathtomcs = PathMsc, Artist = filemsc.Tag.FirstAlbumArtist ?? "unknow", MusicName = filemsc.Tag.Title ?? "unknow", MaxTime = Time_Max((int)filemsc.Properties.Duration.TotalSeconds), MusicImg = ImageSource.FromFile("musicimg.png") };
            Musicinfs.Add(MusInf);
        }
        
    }

Вот мой код для выведения листа
void UpdateFileList()
     {
        filesList.ItemsSource = null;
       
        var music = Directory.GetFiles(pathtomsc, "*mp3") ;
        
        Musicinfs = new List<musicinf> { };
        for (int i = 0; i < music.Length; i++)
        {
            MusicinfsAdd(music[i]);
            
        }
        filesList.ItemsSource = Musicinfs;

        this.BindingContext = this;
        
       
     }
  • Вопрос задан
  • 69 просмотров
Пригласить эксперта
Ответы на вопрос 1
@SZolotov
Asp.net core, MAUI,WPF,Qt, Avalonia
Однозначного ответа вряд ли кто даст. Но я бы поочерёдно (или все одновременно) попробовал следующее:
  1. Выключить кэш у Image
  2. Если filesList - ListView - поиграться со стратегией кэширования
  3. Сохранять картинки в папку для временных файлов и брать их оттуда. Хз как себя ведёт ImageSource.FromStream при кэшировании картинок. Надо смотреть исходник


Замечания по коду.
var music = Directory.GetFiles(pathtomsc, "*mp3") ;

Лучше использовать асинхронные методы, что бы интерфейс (основной поток) не стопорился при длительной работе методов
Musicinfs = new List { };

Лучше ObservableCollection использовать, особенно при изменении данных в коллекции.
filesList.ItemsSource = Musicinfs;
Данные должны биндиться, а не присваиваться. Тогда и приседание с filesList.ItemsSource = null; и filesList.ItemsSource = Musicinfs; исчезнет
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы