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;
}
由于BeginInit
,CacheOption
,BitmapCacheOption
,StreamSource
和EndInit
未定义,因此无法在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});
}
请注意,此示例中的Thumbnail
为IRansomAccessStreamReference
答案 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();
}
}