【问题标题】:Xamarin.Forms ListView with an AutoSize height具有 AutoSize 高度的 Xamarin.Forms ListView
【发布时间】:2020-05-12 05:05:37
【问题描述】:

我阅读了许多 stackoverflow 文章以了解如何设置 ListView 的高度,以便 ListView 与其内容一样高。 但是许多答案都不能解决我的需求。

我尝试调整https://docs.microsoft.com/en-us/samples/xamarin/xamarin-forms-samples/workingwithlistview/ 中的基本列表示例 使用此代码

<AbsoluteLayout HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
        <StackLayout AbsoluteLayout.LayoutFlags="All" AbsoluteLayout.LayoutBounds="0,0,1,1">
            <ScrollView>
                <StackLayout>
                    <StackLayout VerticalOptions="StartAndExpand">
                        <Label Text="Hallo"/>
                    </StackLayout>
                    <StackLayout VerticalOptions="StartAndExpand" >
                        <ListView x:Name="listView" BackgroundColor="Green" VerticalOptions="Start"
                              ItemsSource="{Binding .}" >
                            <ListView.Footer>
                                <Label />
                            </ListView.Footer>
                        </ListView>
                    </StackLayout>
                    <StackLayout>
                        <Label Text="Hallosdf"/>
                    </StackLayout>
                </StackLayout>
            </ScrollView>
        </StackLayout>
    </AbsoluteLayout>

但无论我做什么,都会导致列表太高。绿色元素是超大的列表视图。列表视图下方的所有内容都在视口之外。

非常感谢。 乌韦

【问题讨论】:

    标签: listview xamarin xamarin.forms


    【解决方案1】:

    问题是,您将 2 个具有相同方向的滚动视图(ScrollViewListView)嵌套在一起,而没有一个具有固定高度。

    如果您希望 ListView 缩小到其内容的解决方案:删除 ListView

    有一个BindableLayout 可以与StackLayout 和其他布局一起使用。 (https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/bindable-layouts)

    <AbsoluteLayout HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
        <ScrollView AbsoluteLayout.LayoutFlags="All" AbsoluteLayout.LayoutBounds="0,0,1,1">
            <StackLayout >
                <Label Text="Hallo"/>
                <StackLayout BindableLayout.ItemsSource="{Binding .}" BackgroundColor="Green">
                    <BindableLayout.ItemTemplate>
                        <DataTemplate>
                            <Label Text="{Binding .}"/> 
                        </DataTemplate>
                    </BindableLayout.ItemTemplate>
                </StackLayout>
                <Label Text="Hallosdf"/>
            </StackLayout>
        </ScrollView>
    </AbsoluteLayout>
    

    如果您希望 ListView 拉伸的解决方案:移除 Scrollview

    Hallosdf 标签将显示在ListView 下方,并且只有 ListView 会滚动。顺便说一句:您不需要将每个视图都包装在 StackLayout 中。尽量避免不必要的布局嵌套以获得最佳性能。如果StackLayoutAbsoluteLayout 中的唯一布局,您也可以去掉AbsoluteLayout

    <AbsoluteLayout HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
        <StackLayout AbsoluteLayout.LayoutFlags="All" AbsoluteLayout.LayoutBounds="0,0,1,1">
            <Label Text="Hallo"/>
            <ListView x:Name="listView" BackgroundColor="Green" VerticalOptions="FillAndExpand"
                              ItemsSource="{Binding .}" >
            </ListView>
            <Label Text="Hallosdf"/>
        </StackLayout>
    </AbsoluteLayout>
    

    【讨论】:

    • 这样的情况是不是就不能使用列表视图了?
    • 我认为,还有第三个选项,您可以在其中收听几个 PropertyChanges 并每次手动计算 ListViewHeightRequest。对于相等高度的行,这相对容易 (lv.HeightRequest = lv.ItemsCount*rowHeight) 但这个问题不仅与 Xamarin.Forms 相关。你基本上在每个 UI 框架中都有这个(底层的 Android 和 iOS 控件也是如此)。
    • 如 Shimmy 所写的那样? Xamarin.Forms ListView size to content
    【解决方案2】:

    啊,重要的是 RowHeight。我没有不均匀的行,因此我可以设置 RowHeight。

    <StackLayout Orientation="Vertical"
                 VerticalOptions="Fill"
                 HorizontalOptions="StartAndExpand">
        <ListView VerticalOptions="FillAndExpand"
                  RowHeight="<some row height>">
        </ListView>
    </StackLayout>
    

    Xamarin.Forms: ListView inside StackLayout: How to set height?中找到答案#7

    非常感谢

    【讨论】:

    • 你好,如果问题解决了,记得以后有时间标记一下:)
    【解决方案3】:

    使用 DLToolkit.Forms.Controls.FlowListView

    xmal

    SfListView 方向="水平" QueryItemSize="ListItems_QueryItemSize" ItemsSource="{Binding FavItemList}"

    QueryItemSize 用于设置每个项目的自定义高度

    在代码背后

    private void ListItems_QueryItemSize(object sender,Syncfusion.ListView.XForms.QueryItemSizeEventArgs e)
        {
            if (e.ItemData != null && !string.IsNullOrEmpty((e.ItemData as FavItemsList).Name))
            {
                e.ItemSize = (e.ItemData as FavItemsList).Name.Count() + 80;
                e.Handled = true;
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2015-10-24
      • 1970-01-01
      • 2016-09-20
      • 1970-01-01
      • 1970-01-01
      • 2020-09-09
      • 2015-11-18
      • 2015-05-04
      • 1970-01-01
      相关资源
      最近更新 更多