You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在<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里使用转换器:

  1. 先在页面资源中声明转换器:
<Page.Resources>
    <local:ByteArrayToImageConverter x:Key="ByteArrayToImage"/>
</Page.Resources>
  1. 绑定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 19:01:19