从带有Referrer标头的URL加载图像



我需要从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;
}

相关内容

  • 没有找到相关文章

最新更新