我需要从CDN下载静态图像,并将它们显示在Xamarin.Forms视图中。我是Xamarin的新手,我很难弄清楚如何从HTTP请求中提取的字节数组加载图像。
我的视图中有以下XAML:
<ListView ItemsSource="{Binding Images}">
<ListView.ItemTemplate>
<DataTemplate>
<ImageCell ImageSource="{Binding .}">
</ImageCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
在我的代码中,我获取图像并尝试绑定到ImageSource
实例的集合。
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
}
public ObservableCollection<ImageSource> Images { get; set; } = new ObservableCollection<ImageSource>();
protected override async void OnAppearing()
{
base.OnAppearing();
var client = new HttpClient();
client.DefaultRequestHeaders.Add("Referer", "https://foo.bar/");
var response = await client.GetAsync("https://foo.bar/library/5.jpg");
byte[] image = await response.Content.ReadAsByteArrayAsync();
var imageSource = ImageSource.FromStream(() => new MemoryStream(image));
this.Images.Add(imageSource);
}
}
当我这样做时,StackLayout中的图像是空的。我知道我可以绑定到一个URL,ImageSource可以为我下载它,但我需要传递一个Referrer
标头。无论如何,我都看不到强制XAMLImage
视图允许自定义标头,如果我在代码背后实例化ImageSource
的实例,我也看不到实现这一点的方法。
当我阅读ImageSource
上的文档时,听起来它只支持从中加载图像的URI、文件、流和应用程序资源。由于我有一个字节数组,所以我将它封装在MemoryStream
中,并称之为ImageSource.FromStream
。不过,当应用程序运行时,不会加载任何内容——ImageCell
为空。
我知道图片是下载的。我将byte[]
转换为Base64字符串,然后将其放入Base64到图像解码器。图像加载没有问题,所以我知道它下载正确。我不明白的是为什么我不能在ImageSource
上渲染图像。
我也试过只使用普通的Image
控件,但也遇到了同样的问题。
<ScrollView>
<ContentView>
<StackLayout BindableLayout.ItemsSource="{Binding Images}" Orientation="Horizontal">
<BindableLayout.ItemTemplate>
<DataTemplate>
<Image Source="{Binding}"></Image>
</DataTemplate>
</BindableLayout.ItemTemplate>
</StackLayout>
</ContentView>
</ScrollView>
我在这里是不是做错了什么,还是从互联网上动态下载带有特殊标题的图像是我在Xamarin.Forms中无法做到的?
尝试在页面构造函数中添加this.BindingContext = this;
。
public MainPage()
{
InitializeComponent();
this.BindingContext = this;
}