Imagesource не устанавливается, когда строка поступает из переменной

#c# #xamarin.forms

#c# #xamarin.forms

Вопрос:

Я устанавливаю imagesource следующим образом:

     // get real thumbnail
obj.thumbnailSource = Xamarin.Forms.ImageSource.FromStream(() => 
new MemoryStream(Convert.FromBase64String(fullList[i].thumbnail)));
  

Результатом является пустой фрейм, где должно быть изображение.

С помощью точек остановки мне удалось выяснить, что while на этой позиции fullList[i].thumbnail выдает эту точную строку:

 "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wAARCAA0AGQDASIAAhEBAxEB/8QAGgAAAgMBAQAAAAAAAAAAAAAAAAUCAwQBBv/EADEQAAIBBAECBAUCBgMAAAAAAAECAwAEESESMUEFIlFhEzJxgaGR8BRCscHR4QYVI//EABgBAAMBAQAAAAAAAAAAAAAAAAECAwQA/8QAHxEAAgICAgMBAAAAAAAAAAAAAAECESExAxITQVEU/9oADAMBAAIRAxEAPwDValeI7fWtqnWhUZIEfeMN6jrVPJ4W4vtezf5qKwUZqzUWkC96qMwx13S 9u2CskfmlI8qg9Pc grm6OSso/5PdR/9TNDnLNjG/cV4zIklBjUjXyjfbdPLm0lLZlb4jv6dB9fWtXh/h0cdqGVTz5bJ7 ooxkgyg0ebRTBIpdVKt69CK4gLSkFsDG8nt7V6TxaygkiWQjiyqcYpLJZSWnmIV8oThhgjG6ZMVoyHiMZBPUfWtLNGhbi umCPcf4NZpJGkcknOWJ9t0cwFY7LY0TRAcIHVz9AK65yqjA6ZwKguT3IBpv4Z4Q15uRxGg7H5j/qlnNRVsMYOTpCoRkjv9qK9nF4LaJGFETPjuc0VD9HxMt4V9GU96sZKglmHUKMkfX0rGHub4skQC5x5i3T10R/uqktyVXiWjUfyiq5Vl/iVCIrRR7cF x1377/ABRc/SAoe2W3KsralVownN/hjqD0xk77/pXFlt18uVyRzK5Gd9/fvWq3lh8YgmtmbKBxjl8xxvXf0 xpbcWtna36rE7ALt XzAZA479qVq9g7OGgM8jXoVNKBkqwxkfvNM4po5l5RgFTnocilE0kMTQlEDgAgAtkY1nXTdStLmS3nQR2zIshwQQd4J3nHuP0p41Qna2XCZXnbl5o10B1KkY02ehywpLefxgDGRWKs5HNgcAY/TBz KZiYT K3iqGRJuJUepXWfvg v4rJcXUg5W8sIEYIyrsMsd4J0delPdMZiA8AfKSdnqO3apwW8lw/CNSx/pW54uTkx28YHXPUH9BV8XxY4uRRVUb8ikKfrui54wKov4StbBLfzS4Z 1X/EVXDJIFYdMHdQkt5VWOb4YKt8wVfMtXCJThmidQNgyA5/NZnJPNmlJrFUb4fHJI4wstqrsP5lfiD9qKyCLOwKKZcrQr4Yse3cD268n44J68v37Uj8RSYyGRZuCYI8wIG8Dr/am92014o MuMAgcTn70vt5zd28Q IFYgiRHUEfeu69XgVyuOSfh9/FZeHPGsazXCtk56EZ utaHvXfGWt7iWzaORDIwywDZyowf75 1JfF7JFMjwY4ggeUEYHr9P361F7VUS3Mr8HJ4aYb3kZ9d5HtgVSs2QeVRbIqz3RERHFVwfQfT8V0q1pCzZPxCvFQe2ddKvgt1hTk3l6Eg569gR96z37H43HZGckfY0E7Y0FRRHKIJECErIj45DWRxAJ/H5pos806/Dd2eKT5lPqPWk4iV0wVwzZIOcb/f9abWDh40kzk4GR79DRaHjszzRRwt8QRHgvzcVHSg4MIe2LmMk89a/wBUxkZRE2gF70vjvVEAtrY4C5yTonNQl2rBt4pJYKFLBRxJznC4pheTIsESTzNHNxzhlxn9P3qq7q8mk8MEKDhKrDzA416jHfVZrW a6m HcIsskS5D42Njr oqkFGnJ5I8vJKTUdGuOQhBybJ9SKKs4s yaKjY4ua8uLO5eKOZmVGwOWz1p3ZXBu1/90jfHTK5oorajCyy68ItnidwZF8uMBtfXdIlhFx4rAJHchnGs6G w7UUUJaEHniUSRzAKNZ6Z9KWhI/43cakONgjIFFFZEM9GLxDCXYRQAuOWPvV9nkRzEEgjYx74zRRWj0ikdI3ynY0N4zXmrsCO6mEeU4MQCpxrdFFdDY0tFD3U8i8WkbHTA1mmfgUSFixGSwI37Y/zRRTzSUXQsG3JWNLido5OIC4x3FFFFZUjQz/2Q=="
  

Если я сейчас возьму эту длинную строку и просто добавлю ее в код, заменив fullList[i].thumbnail часть, изображение будет отображаться нормально (вы также можете попробовать эту строку в HTML). Это даст вам (и дало мне) правильную фотографию.

Опять же, при установке этого параметра из переменной, содержащей эту строку, изображение не отображается.

Есть ли что-то странное с imagesource, за которым я наблюдаю?

(Это тот самый тип):

 public class User
{
   public string userEmail { get; set; }
    public string userPassword { get; set; }
    public string isFirstLogIn { get; set; }
    public string fullName { get; set; }
    public string thumbnail { get; set; }

    public Xamarin.Forms.ImageSource thumbnailSource { get; set; }

}
  

Редактировать: это еще более странно:

Что ДЕЙСТВИТЕЛЬНО работает, было бы так:

             byte[] res = Convert.FromBase64String(fullList[i].thumbnail);
            // get real thumbnail
            obj.thumbnailSource = ImageSource.FromStream(
                            () => new MemoryStream(res));
  

Я просто преобразую строку в массив байтов и добавляю массив байтов в поток. Это работает!
Делая это немедленно, ничего не отображается.

Что происходит?

Комментарии:

1. если все остальное в порядке, то я думаю, что это просто простой случай повышения свойства, вам нужно вывести свою User модель INotifyPropertyChanged и повысить thumbnailSource свойство

Ответ №1:

Я полагаю, что это имеет значение для памяти, поэтому я открыт для предложений.

Вместо того, чтобы использовать new MemoryStream(Convert.FromBase64String(fullList[i].thumbnail)) для получения a Stream , я возвращаю массив байтов изображения из GetDraftImageAsyncBytes() метода.

Вместо того, чтобы загружать поток напрямую, в лямбде ImageSource я каждый раз создаю новый:

 var bytes = await _imageDownloader.GetDraftImageAsyncBytes();
MainImageSource = ImageSource.FromStream(() => new MemoryStream(bytes));
  

Они bytes останутся в памяти, и поток будет disposed каждый раз, но также будет воссоздаваться, когда Xamarin вызывает лямбда-функцию во время рендеринга.