如何在<Image>控件中显示属性类资源图片?
解决UWP中byte[]绑定Image.Source的问题
首先明确:你查到的BitmapImage.BeginInit/EndInit是WPF的API,UWP里并不支持,这就是方法无法被识别的原因。下面给你两种可行的解决思路:
方法一:用值转换器实现绑定转换
这是绑定场景下最常用的方案,写一个转换器把byte[]转成UWP支持的BitmapImage:
using Windows.UI.Xaml.Data; using Windows.UI.Xaml.Media.Imaging; using System.IO; using Windows.Storage.Streams; public class ByteArrayToImageConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, string language) { if (value is byte[] imageBytes && imageBytes.Length > 0) { var bitmap = new BitmapImage(); using (var stream = new InMemoryRandomAccessStream()) { var writer = new DataWriter(stream.GetOutputStreamAt(0)); writer.WriteBytes(imageBytes); await writer.StoreAsync(); await writer.FlushAsync(); writer.DetachStream(); stream.Seek(0); await bitmap.SetSourceAsync(stream); } return bitmap; } return null; } public object ConvertBack(object value, Type targetType, object parameter, string language) { throw new NotImplementedException(); } }
在XAML里使用转换器:
- 先在页面资源中声明转换器:
<Page.Resources> <local:ByteArrayToImageConverter x:Key="ByteArrayToImage"/> </Page.Resources>
- 绑定Image的Source时指定转换器:
<Image Source="{x:Bind MyImage, Converter={StaticResource ByteArrayToImage}}"/>
方法二:在ViewModel中直接转换为BitmapImage属性
如果不想用转换器,可以在ViewModel里新增一个BitmapImage类型的属性,当byte[]属性更新时同步转换:
private byte[] _myImage; public byte[] MyImage { get => _myImage; set { _myImage = value; ConvertToBitmap(); OnPropertyChanged(nameof(MyImage)); OnPropertyChanged(nameof(MyBitmapImage)); } } public BitmapImage MyBitmapImage { get; private set; } private async void ConvertToBitmap() { if (MyImage == null || MyImage.Length == 0) { MyBitmapImage = null; return; } var bitmap = new BitmapImage(); using (var stream = new InMemoryRandomAccessStream()) { var writer = new DataWriter(stream.GetOutputStreamAt(0)); writer.WriteBytes(MyImage); await writer.StoreAsync(); await writer.FlushAsync(); writer.DetachStream(); stream.Seek(0); await bitmap.SetSourceAsync(stream); } MyBitmapImage = bitmap; }
然后直接绑定这个BitmapImage属性:
<Image Source="{x:Bind MyBitmapImage}"/>
补充说明
你之前转Bitmap报错,是因为UWP里的Bitmap属于Windows.Graphics.Imaging命名空间,它并不是ImageSource的子类,无法直接绑定到Image的Source属性,必须转换为BitmapImage或WriteableBitmap这类实现了ImageSource接口的类型。
内容的提问来源于stack exchange,提问作者Ayes
相关产品推荐
相关产品推荐

