C# 如何在Xamarin.Forms中强制将ViewCell的图像调整为特定大小?
这是一个场景: 我有一个列表,可以包含任何大小的图像(400x400、1x1、5837x2472,你明白了)。图像需要调整大小,以便使用XAML(最好)使每个图像具有相同的分辨率 这就是它现在的样子: 正如你所看到的,第二张图片太宽了 我不是很聪明,当涉及到图像和调整/裁剪他们,所以我道歉,如果这是一个愚蠢的问题 当前代码:C# 如何在Xamarin.Forms中强制将ViewCell的图像调整为特定大小?,c#,image,xaml,xamarin,xamarin.forms,C#,Image,Xaml,Xamarin,Xamarin.forms,这是一个场景: 我有一个列表,可以包含任何大小的图像(400x400、1x1、5837x2472,你明白了)。图像需要调整大小,以便使用XAML(最好)使每个图像具有相同的分辨率 这就是它现在的样子: 正如你所看到的,第二张图片太宽了 我不是很聪明,当涉及到图像和调整/裁剪他们,所以我道歉,如果这是一个愚蠢的问题 当前代码: <DataTemplate x:Key="dummyTemplate"> <ViewCell>
<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),因为我想使用库来显示占位符
有谁能告诉我如何操作这些图像,使它们大小相同吗?我认为您应该能够使用这些额外的属性:
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
将显示整个图像,但可以用字母框(顶部和底部的一个条形)或使用AspectFill
填充整个300x300的宽度和高度,但可能会丢失图像的某些部分,因为它们不适合
正如评论中指出的那样;您可能希望将
水平选项设置为不同于填充扩展盘的选项。因为这意味着它将扩展到可用的空间。而是将其设置为Start
我认为您应该能够使用这些额外属性来完成此操作:
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
将显示整个图像,但可以用字母框(顶部和底部的一个条形)或使用AspectFill
填充整个300x300的宽度和高度,但可能会丢失图像的某些部分,因为它们不适合
正如评论中指出的那样;您可能希望将水平选项设置为不同于填充扩展盘的选项。因为这意味着它将扩展到可用的空间。而是将它设置为开始
答案不错,我同意这一点。。。我刚刚打开VS来测试我头脑中的这种答案,但我想测试一下,但是看到这段代码,我同意这个答案,这是我去年在一个学校项目中使用的一种方法,这是一个最好的解决方案。向上投票:)谢谢你的回复!我只是试了一下,可惜什么都没变。我今晚/明天还要做更多的工作。我的产品负责人告诉我,如果图像太大(比如我示例中的第二个),我希望边缘应该被“切掉”,这样它就会是一个正方形。您的代码示例是否可以处理此问题?这可能是由于HorizontalOptions=“FillAndExpand”图像占用的空间比您通过“高度”和“宽度”属性定义的还要多。您可以尝试将其设置为“开始”,然后定义高度和宽度。是的,对于“高度和宽度”请求,您必须将水平和垂直选项从FillAndExpand(默认设置为)更改为“居中”、“开始”或“结束”。我同意这一点。。。我刚刚打开VS来测试我头脑中的这种答案,但我想测试一下,但是看到这段代码,我同意这个答案,这是我去年在一个学校项目中使用的一种方法,这是一个最好的解决方案。向上投票:)谢谢你的回复!我只是试了一下,可惜什么都没变。我今晚/明天还要做更多的工作。我的产品负责人告诉我,如果图像太大(比如我示例中的第二个),我希望边缘应该被“切掉”,这样它就会是一个正方形。您的代码示例是否可以处理此问题?这可能是由于HorizontalOptions=“FillAndExpand”图像占用的空间比您通过“高度”和“宽度”属性定义的还要多。您可以尝试将其设置为“开始”,然后定义高度和宽度。是的,对于“高度和宽度”请求,您必须将水平和垂直选项从FillAndExpand(默认设置为)更改为“居中”、“开始”或“结束”