【问题标题】:Imagesource is not set when string is coming from variable字符串来自变量时未设置图像源
【发布时间】:2020-11-10 14:32:00
【问题描述】:

我正在像这样设置图像源:

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

结果是应该有图片的空帧。

通过停止点,我设法发现在这个位置 fullList[i].thumbnail 给出了这个确切的字符串:

"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"

如果我现在将这个长字符串简单地添加到代码中,替换 fullList[i].thumbnail 部分,图像就可以很好地呈现(您也可以在 HTML 中尝试这个字符串)。它会给你(也给我)正确的照片。

同样,从包含该字符串的变量中设置它,不显示任何图片。

我正在监督的图像源有什么奇怪的地方吗?

(这是类型):

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));

我只是将字符串转换为字节数组并将字节数组添加到流中。这行得通! 立即执行,不会渲染任何内容。

发生了什么事?

【问题讨论】:

  • 如果其他一切都很好,那么我认为这只是一个简单的提升属性的案例,您需要使用INotifyPropertyChanged 导出您的User 模型并提升thumbnailSource 属性

标签: c# xamarin.forms


【解决方案1】:

我想这对记忆有影响,所以我愿意接受建议。

我没有使用new MemoryStream(Convert.FromBase64String(fullList[i].thumbnail)) 来获取Stream,而是从GetDraftImageAsyncBytes() 方法返回图像字节数组。

我没有直接加载流,而是在 ImageSource lambda 中每次都创建一个新流:

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

bytes 将保留在内存中,并且每次流将是 disposed,但也会在 Xamarin 在渲染期间调用 lambda 函数时重新创建。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    相关资源
    最近更新 更多