【问题标题】:Xamarin Images sometimes not downloaded inside ListViewXamarin 图像有时未在 ListView 中下载
【发布时间】:2019-06-13 01:55:23
【问题描述】:

我有一个包含两列的 ListView,其中最左边包含一个 <Image>,如下所示:

<ListView.ItemTemplate>
    <DataTemplate>
        <ViewCell>
            <ViewCell.View>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="0.5*" />
                        <ColumnDefinition Width="0.5*" />
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                    </Grid.RowDefinitions>
                    <AbsoluteLayout Grid.Column="0" Grid.Row="0">
                        <Image 
                            HeightRequest="130" 
                            Aspect="AspectFill" 
                            Source="{Binding DynamicOfferImage}" 
                            local:ImageBinding.URL="{Binding DynamicOfferURL}" 
                            AbsoluteLayout.LayoutBounds="1,1,1,1" 
                            AbsoluteLayout.LayoutFlags="All">
                            <Image.Aspect>
                                <OnPlatform x:TypeArguments="Aspect">
                                    <On Platform="iOS">AspectFit</On>
                                    <On Platform="Android">AspectFit</On>
                                </OnPlatform>
                            </Image.Aspect>
                            <Image.GestureRecognizers>
                                <TapGestureRecognizer
                                    Tapped="OnImageTapGestureRecognized"
                                    NumberOfTapsRequired="1" />
                            </Image.GestureRecognizers>
                        </Image>
                        <StackLayout IsVisible="{Binding IsRedeemed}" Margin="20" AbsoluteLayout.LayoutBounds="1,1,1,1" AbsoluteLayout.LayoutFlags="All">
                            <ContentView Padding="3" BackgroundColor="#d9534f">
                                <Label Text="{loc:_ S=LoginIsRedeemed}" FontSize="Medium" TextColor="#ffffff" HorizontalOptions="Center"></Label>
                            </ContentView>
                        </StackLayout>
                    </AbsoluteLayout>

                    <StackLayout Grid.Column="1" Grid.Row="0">
                        <!-- Text here, irrelevant to question -->
                    </StackLayout>
                </Grid>
            </ViewCell.View>
        </ViewCell>
    </DataTemplate>
</ListView.ItemTemplate>

&lt;Image&gt;Source 属性绑定到托管在 Amazon S3 上的 JPEG 图像的 URL。问题是大部分时间这些图片都可以正常下载,但是有时一张图片,甚至所有图片都不会下载(或不会显示?)

在用户重新安装应用程序之前,此问题不会消失。即使重新启动应用程序也不算数,它必须是实际的重新安装。

下面是在某些情况下最终的样子的模型:

非常感谢任何帮助!

注意:这不是Xamarin Forms ListView Images Sometimes Displays, Sometimes Doesn't (UWP) 的重复,因为描述的场景不同。

【问题讨论】:

  • local:ImageBinding.URL="{Binding DynamicOfferURL}" 是什么?会不会干扰图像显示?对我来说,似乎存在某种竞争条件,例如,如果图像下载失败,图像不会显示,或者从 AWS 获取图像的请求有时只是超时。您可以尝试将所需的图像下载并缓存到本地文件,然后将该文件用作图像的源。这样可以更好的观察图片的http请求,下载失败后重试。
  • local:ImageBinding.URL 只是一个自定义绑定,我用来通过点击手势添加外部链接,从视图模型绑定。每个列表项总是有一个绑定的 URL,用于链接到所显示项目的网站版本。出于这个原因,我怀疑它与这个问题有关。感谢您的建议,如果没有更简单的解决方案,我可能会尝试一下。
  • 你为什么不用ffimageloading
  • 图片下载完成后,是否更新主线程的imageView?
  • 我没有下载图像然后进行设置,我只是将 XAML 中的图像源设置为 S3 中图像的 URL。图片自动下载并显示

标签: c# xamarin xamarin.forms xamarin.ios xamarin.android


【解决方案1】:

我最终接受了 G.hakim 的建议,并决定为图像使用 FFImageLoading(通过 NuGet 包)。尽管我不得不为 Xamarin.Android 使用稍旧的版本,但它非常简单。最新版本 (2.4.4.859) 出现了一些奇怪的链接器错误,必须回到 2.4.1。无论哪种方式,它的效果都非常好,甚至可以为 Xamarin.iOS 上的图像添加一点动画。

这是我之前的代码:

<Image 
    HeightRequest="130" 
    Aspect="AspectFill" 
    Source="{Binding ImageURL}" 
    local:ImageBinding.URL="{Binding LinkURL}" 
    AbsoluteLayout.LayoutBounds="1,1,1,1" 
    AbsoluteLayout.LayoutFlags="All">
    <Image.Aspect>
        <OnPlatform x:TypeArguments="Aspect">
            <On Platform="iOS">AspectFit</On>
            <On Platform="Android">AspectFit</On>
        </OnPlatform>
    </Image.Aspect>
    <Image.GestureRecognizers>
        <TapGestureRecognizer
            Tapped="OnImageTapGestureRecognized"
            NumberOfTapsRequired="1" />
    </Image.GestureRecognizers>
</Image>

为了让 FFImageLoading 工作,您必须将其添加到根 &lt;ContentPage&gt; 元素:

xmlns:ffimageloading="clr-namespace:FFImageLoading.Forms;assembly=FFImageLoading.Forms"
xmlns:fftransformations="clr-namespace:FFImageLoading.Transformations;assembly=FFImageLoading.Transformations"

然后我能够做到这一点:

<ffimageloading:CachedImage 
    AbsoluteLayout.LayoutBounds="1,1,1,1" 
    AbsoluteLayout.LayoutFlags="All"
    HeightRequest="130"
    DownsampleToViewSize="true" 
    Source="{Binding ImageURL}"
    local:ViewBinding.URL="{Binding LinkURL}">
    <ffimageloading:CachedImage.GestureRecognizers>
        <TapGestureRecognizer
            Tapped="OnViewTapGestureRecognized"
            NumberOfTapsRequired="1" />
    </ffimageloading:CachedImage.GestureRecognizers>
</ffimageloading:CachedImage>

为了让它与我的TapGestureRecognizer 一起工作,我将方法中的((Image)sender) 转换为((View)sender) 转换,因为FFImageLoading 中的CachedImage 类实际上并没有从Image 继承,它继承来自View。如果您有手势甚至自定义绑定,请记住一些事情。

除此之外,它非常即插即用,我对结果非常满意。

【讨论】:

  • 最好使用 FFImageLoading
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多