40

在一个里面ContentPage我有一个ListView里面一个StackLayout里面一个ScrollView。在被调用时ListView填充(ItemSource设置),我可以看到该列表已填充在模拟器中。s 方向是和低于我有一个。ContentPageOnAppearingStackLayoutVerticalListViewButton

我的问题是,无论有多少元素ListView,它的高度都是 53.33。我希望 的高度ListView与其中项目的总高度相匹配。通过设置HeightRequest我可以设置的高度ListView我想要的任何东西,但由于我不知道里面项目的高度,ListView结果通常是到它下面的按钮的距离不正确,因此看起来很丑。我试图同时设置VerticalOptionstheListViewStackLayouttoStart以及其他设置,但这不会改变 53.33 的高度(如果我尝试结合使用HeightRequestStart结果是 HeightRequest 胜出)。

我该如何解决这个问题?

(请原谅交叉张贴(请原谅Xamarin 论坛

4

8 回答 8

21

借助BindableLayoutXamarin Forms 3.5 中的新功能,您可以轻松地ItemsSource使用StackPanel.

所以,基本上你可以这样写:

<StackLayout BindableLayout.ItemsSource="{Binding list}">
    <BindableLayout.ItemTemplate>
        <DataTemplate>
            ...
        </DataTemplate>
    </BindableLayout.ItemTemplate>
</StackLayout>

您可以在此处阅读更多相关信息:https ://blog.xamarin.com/xamarin-forms-3-5-a-little-bindable-love/

于 2019-02-09T14:24:44.037 回答
20

在我的情况下,解决方案是将ListViewa 放在里面StackLayout,然后把它StackLayout放在 main 里面StackLayout。然后我可以VerticalOptions = LayoutOptions.FillAndExpand在内部StackLayout(包含 的那个ListView)上设置它,结果ListView得到它需要的空间(当然这取决于数据)。

这是主要代码:

listView.ItemsSource = alternativeCells;
listView.ItemSelected += ListViewOnItemSelected;
var listStackLayout = new StackLayout
{
    VerticalOptions = LayoutOptions.FillAndExpand,
    Orientation = StackOrientation.Vertical
};
listStackLayout.Children.Add(listView);
_stackLayout.Children.Add(listStackLayout);

正如你所看到的,我添加了一个新StackLayout的,唯一的目的是把它放在ListView里面。然后我把它listStackLayout放在 main 里面_stackLayout

有关详细信息,请参阅此 Xamarin 论坛帖子上的帖子

于 2014-07-23T08:57:09.440 回答
16

我遇到了同样的问题,对我来说这就像一个魅力:

listView.HasUnevenRows = true;

http://developer.xamarin.com/guides/cross-platform/xamarin-forms/working-with/listview/#Display_Rows_with_Variable_Heights

于 2015-06-23T21:25:28.427 回答
8

我遇到了同样的问题,这是我为我解决的唯一一件事(在 XAML 中):

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

希望它有效!

于 2016-05-06T20:32:27.943 回答
8

下面的代码对我有用,

protected override void OnAppearing()
{
base.OnAppearing(); 
listViewOrderCloths.HeightRequest = model.ListOrderedCloths.Count*100)/2 ;
}
于 2016-05-22T07:29:34.543 回答
1

我也有类似的挣扎,但解决方案略有不同。首先,在 ListView 上设置 RowHeight 似乎很关键。其次,我遇到了绑定+时间问题。如果 ListView 已显示并且没有内容,则将其设置为默认高度(显示空白区域)。如果我离开这个页面然后回来,尺寸很好。

所以我的方法是将 ListView 的可见性与绑定的东西的存在(或缺乏)绑定。然后,当数据返回时,ListView 变得可见并具有适当的大小。

<ListView x:Name="lvSettlements" ItemsSource="{Binding RecentSettlements}"  VerticalOptions="FillAndExpand" RowHeight="25" IsVisible="{Binding RecentSettlements, Converter={StaticResource nullConverter}}">
...SNIP...
</ListView>
于 2016-10-14T17:43:13.917 回答
0

接受的答案不适用于我的情况,其中 myListView可能比显示器的长度长,因此它需要放在 a 内ScrollView,这会带回空白空间。

我解决这个问题的方法是拥有顶级StackLayout,然后将其ListView放在一个 immediateScrollView中,如下面的 XAML:

<?xml version="1.0" encoding="utf-8" ?>
<local:ContentPage>
    <StackLayout x:Name="entirePage">
        <ScrollView VerticalOptions="FillAndExpand"
            Orientation="Vertical">
            <ListView x:Name="listView" ItemsSource="{Binding Items}"
                Margin="0">
                <!-- ListView Stuff -->
            </ListView>
        </ScrollView>
    </StackLayout><!--entirePage-->
</local:ContentPage >
于 2018-12-26T13:08:03.313 回答
0

在 Android 上,我在代码中创建的表格在其上方和下方留下了空白。

这解决了它...

HeightRequest="1000000"

我想我有最骇人听闻的解决方案。

于 2018-04-26T14:47:31.827 回答