如何在Xamarin.Forms中强制将ViewCell的图像调整为一定大小?

时间:2017-04-28 12:58:39

标签: c# image xaml xamarin xamarin.forms

这是情景:

我有一个列表可以包含任何大小的图像(400x400,1x1,5837x2472,你明白了)。需要调整图像大小以使每个图像使用XAML(最好)具有相同的分辨率。

这就是现在的样子:

enter image description here

如您所见,第二张图像太宽。

关于图像和调整大小/裁剪它们我不是很聪明所以如果这是一个愚蠢的问题我会道歉。

当前代码:

<DataTemplate x:Key="dummyTemplate">
            <ViewCell>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="60"/>
                    </Grid.ColumnDefinitions>

                    <ffimageloading:CachedImage
                        Grid.Column="0"
                        Grid.RowSpan="2"
                        HorizontalOptions="FillAndExpand"
                        Aspect="AspectFit"
                        Source="{Binding ImageSourceProperty}"
                        LoadingPlaceholder="placeholder_list.png"
                        ErrorPlaceholder="placeholder_list.png">
                    </ffimageloading:CachedImage>

                    <Label Text="{Binding TextProperty}" TextColor="#000000" Grid.Column="1" Grid.Row="0"/>
                    <Label Text="{Binding DetailProperty}" TextColor="#999999" Style="{StaticResource CaptionTextStyle}"  Grid.Column="1" Grid.Row="1"/>
                </Grid>             
            </ViewCell>
</DataTemplate>

我正在使用自定义ViewCell而不是ImageCell(尽管最终它应该看起来像ImageCell),因为我想使用FFImageLoading库来显示占位符。

有人能告诉我如何操作图像以使它们的大小相同吗?

1 个答案:

答案 0 :(得分:4)

我认为你应该能够使用这些额外的属性来做到这一点:

WidthRequest="300" HeightRequest="300" DownsampleToViewSize="true",就像这样:

<ffimageloading:CachedImage
    Grid.Column="0"
    Grid.RowSpan="2"
    HorizontalOptions="FillAndExpand"
    Aspect="AspectFit"
    Source="{Binding ImageSourceProperty}"
    LoadingPlaceholder="placeholder_list.png"
    ErrorPlaceholder="placeholder_list.png"
    WidthRequest="300"
    HeightRequest="300"
    DownsampleToViewSize="true">
</ffimageloading:CachedImage>

这会将图像大小调整为300x300并对其进行缩减采样,而不是缩放它们,这将大大降低您的内存使用量。

然后由您决定如何处理Aspect="AspectFit"属性。使用AspectFit整个图像将会显示,但可以是letterboxed(顶部和底部有一个条形图),或者你可以使用AspectFill来填充整个300x300的宽度和高度,但它可能是你丢失了部分图像,因为它们不适合。

正如评论中指出的那样;您可能希望将HorizontalOptions设置为与FillAndExpand不同的内容。因为这意味着它将扩展到可用的空间。而是将其设置为Start