代码之家  ›  专栏  ›  技术社区  ›  Johnathon Sullinger

从URL加载带有引用标头的图像

  •  0
  • Johnathon Sullinger  · 技术社区  · 3 年前

    我需要从CDN下载静态图像并在Xamarin中显示它们。窗体视图。我是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 标题。我无论如何也看不到要强制使用XAML Image 在我的代码背后。

    当我在上阅读文档时 听起来它只支持URI、文件、流和应用程序资源来加载图像。因为我有一个字节数组,所以我把它包装在一个 MemoryStream ImageSource.FromStream . 当应用程序运行时,不会加载任何内容 ImageCell 是空的。

    byte[] 到Base64字符串,然后将其放入 Base64 to Image Decoder . 图像加载没有问题,所以我知道它被正确下载。我不明白的是,为什么我不能让图像在计算机上渲染 .

    我也试着用一个普通的 控件和具有相同的问题。

        <ScrollView>
            <ContentView>
                <StackLayout BindableLayout.ItemsSource="{Binding Images}" Orientation="Horizontal">
                    <BindableLayout.ItemTemplate>
                        <DataTemplate>
                            <Image Source="{Binding}"></Image>
                        </DataTemplate>
                    </BindableLayout.ItemTemplate>
                </StackLayout>
            </ContentView>
        </ScrollView>
    

    我在这里做的是完全错误的事情,还是从互联网上动态下载带有特殊标题的图片,这是我在Xamarin中无法做到的。形式?

    0 回复  |  直到 3 年前
        1
  •  1
  •   ColeX    3 年前

    尝试添加 this.BindingContext = this;

       public MainPage()
       {
            InitializeComponent();
    
            this.BindingContext = this;
       }