来自 MemoryStream 的 UWP BitmapImage SetSource 挂起

Mik*_*per 4 c# binding bitmapimage uwp

在我的 UWP 应用程序中,我以字节 [] 的形式将图像存储在 SQLite 数据库中。然后,当我从数据库中检索我的对象时,我将它们绑定到具有 Image 控件的 GridView 数据模板。由于我无法将 Image 的 Source 直接绑定到数组,所以我在对象的类中创建了一个 BitmapImage 属性来将 Image 控件绑定到:

    public BitmapImage Icon
    {
        get
        {
            using (var stream = new MemoryStream(icon))
            {
                stream.Seek(0, SeekOrigin.Begin);
                var img = new BitmapImage();
                img.SetSource(stream.AsRandomAccessStream());
                return img;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

问题是,我的应用程序挂在 img.SetSource 行上。经过一些试验,我发现这个问题可以用第二个 MemoryStream 来克服:

    public BitmapImage Icon
    {
        get
        {
            using (var stream = new MemoryStream(icon))
            {
                stream.Seek(0, SeekOrigin.Begin);
                var s2 = new MemoryStream();
                stream.CopyTo(s2);
                s2.Position = 0;
                var img = new BitmapImage();
                img.SetSource(s2.AsRandomAccessStream());
                s2.Dispose();
                return img;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

出于某种原因,它有效,不会挂起。我想知道为什么?以及如何正确处理这种情况?谢谢!

Kas*_*Due 6

我建议您在应用程序中显示图像之前使用 IValueConverter 接口。

class ImageConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        if (value == null || !(value is byte[]))
            return null;
        using (InMemoryRandomAccessStream ms = new InMemoryRandomAccessStream())
        {
            using (DataWriter writer = new DataWriter(ms.GetOutputStreamAt(0)))
            {
                writer.WriteBytes((byte[])value);
                writer.StoreAsync().GetResults();
            }
            var image = new BitmapImage();
            image.SetSource(ms);
            return image;
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}
Run Code Online (Sandbox Code Playgroud)