带有方形图像的 Xamarin Forms CollectionView

Vla*_*lyk 2 collectionview xamarin xamarin.forms

我想使用 Xamarin Forms 将图像列表显示为具有多行(2 或 4)的网格。网格的每个单元格必须是正方形的。我在 DataTemplate 中使用具有垂直布局、所需跨度和固定 HeightRequest 的 CollectionView。我得到多列网格,但我无法使图像(单元格)平方。

<CollectionView ItemsSource="{Binding .}">
            <CollectionView.ItemsLayout>
                <GridItemsLayout Orientation="Vertical" Span="2" />
            </CollectionView.ItemsLayout>
            <CollectionView.ItemTemplate>
                <DataTemplate>
                    <Image
                        HeightRequest="100"
                        x:Name="imageCell"
                        Aspect="AspectFill"
                        Source="{Binding .}" />
                </DataTemplate>
            </CollectionView.ItemTemplate>
        </CollectionView>
Run Code Online (Sandbox Code Playgroud)

Vla*_*lyk 5

感谢其他答案,我最终得到了自定义 ContentView 设置 HeightRequest 等于宽度和其中的图像。

    public class SquareView : ContentView
    {
        protected override void OnSizeAllocated(double width, double height)
        {
            base.OnSizeAllocated(width, height);
            HeightRequest = Width;
        }
    }

Run Code Online (Sandbox Code Playgroud)

和 XAML

<CollectionView
                ItemsSource="{Binding .}">
                <CollectionView.ItemsLayout>
                    <GridItemsLayout
                        Orientation="Vertical"
                        Span="2" />
                </CollectionView.ItemsLayout>
                <CollectionView.ItemTemplate>
                    <DataTemplate>
                        <views:SquareView>
                            <Image
                                HeightRequest="20"
                                Aspect="AspectFill"
                                Source="{Binding .}" />
                        </views:SquareView>
                    </DataTemplate>
                </CollectionView.ItemTemplate>
            </CollectionView>
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的解决方法!然而,就我而言,“HeightRequest = Width”有时会被忽略。在该行之前添加“await Task.Yield()”使其对我来说更加稳定。或者,它可以包装在 `BeginInvokeOnMainThread` 中,[参见相关答案](/sf/answers/3470523381/)。 (2认同)