将XAML图像绑定到IRandomAccessStreamReference

时间:2016-06-03 11:24:05

标签: c# xaml binding uwp

Windows UWP C#API使用IRandomAccessStreamReference,虽然我可以得到如下的字节数组,但我不能使用我期望在BitmapImage(来自WPF)中找到的方法来生成Bitmap图像;即使我可以,我觉得这个解决方案太过于笨拙,并且没有成为预期的方法,而且它会滥用异步加载。

这在UWP中编译:

private static byte[] GetBytes(IRandomAccessStreamReference r)
{
    var stream = r.OpenReadAsync().GetResults();

    var bytes = new byte[stream.Size];
    stream.ReadAsync(bytes.AsBuffer(), (uint)stream.Size, InputStreamOptions.None).GetResults();

    return bytes;
}

由于BeginInitCacheOptionBitmapCacheOptionStreamSourceEndInit未定义,因此无法在UWP中进行编译:

public static BitmapImage ToImage(byte[] array)
{
    using (var ms = new System.IO.MemoryStream(array))
    {
        var image = new BitmapImage();
        image.BeginInit();
        image.CacheOption = BitmapCacheOption.OnLoad; // here
        image.StreamSource = ms;
        image.EndInit();
        return image;
    }
}

我应该如何最好地使用IRandomAccessStreamReference来显示带有UWP的图像?

我的具体用例是处理Windows联系人,我想构建一个集合并绑定到它;类似的东西:

public void InitialiseSomeViewModel()
{
    var contactStore = ContactManager.RequestStoreAsync();
    contactStore.GetResults().FindContactsAsync().GetResults();

    ContactInfo = c.Select(x => new MyContactEntity { Name = x.Name, Thumbnail = x.Thumbnail});
}

请注意,此示例中的ThumbnailIRansomAccessStreamReference

1 个答案:

答案 0 :(得分:1)

我认为最好的方法是使用 InMemoryRandomAccessStream IValueConverter 界面。因此,您可以解码执行运行时绑定的字节数组。

首先,您需要在XAML中的图像控件中指定valueconverter。

然后您可以使用以下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);

            //other specification

            return image;
        }
    }

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