Xamarin.Forms:StackLayout里面的ListView:如何设置高度?

时间:2014-07-06 17:07:32

标签: xamarin.forms

ContentPageListViewStackLayout内有ScrollView ListView。当ItemSource被调用时,ContentPage中填充OnAppearingStackLayout已设置),我可以看到该列表已填充在模拟器中。 Vertical方向为ListView,低于Button我有ListView

我的问题是,无论ListView有多少元素,它都会达到53.33的高度。我希望HeightRequest的高度与其中项目的总高度相匹配。通过设置ListView,我可以将ListView的高度设置为我想要的任何内容,但由于我不知道VerticalOptions内项目的高度,结果通常是距离它下面的按钮不正确,因此看起来很难看。我试图在ListViewStackLayoutStart以及其他设置上设置HeightRequest,但这不会改变53.33的高度(如果我尝试使用Start和{{1}}进行组合,结果证明HeightRequest胜出了。)

我该如何解决这个问题?

(请原谅Xamarin forum的交叉发布)

8 个答案:

答案 0 :(得分:16)

我的解决方案是将ListView放在StackLayout内,然后将StackLayout放在主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放在主_stackLayout内。

有关详细信息,请参阅this Xamarin forum post上的帖子

答案 1 :(得分:10)

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

listView.HasUnevenRows = true;

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

答案 2 :(得分:8)

以下代码适用于我,

protected override void OnAppearing()
{
base.OnAppearing(); 
listViewOrderCloths.HeightRequest = model.ListOrderedCloths.Count*100)/2 ;
}

答案 3 :(得分:7)

借助Xamarin Forms 3.5中的新BindableLayout功能,您可以轻松地在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/

答案 4 :(得分:6)

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

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

希望它有效!

答案 5 :(得分:0)

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

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

<ListView x:Name="lvSettlements" ItemsSource="{Binding RecentSettlements}"  VerticalOptions="FillAndExpand" RowHeight="25" IsVisible="{Binding RecentSettlements, Converter={StaticResource nullConverter}}">
...SNIP...
</ListView>

答案 6 :(得分:0)

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

这修好了......

HeightRequest="1000000"

我认为我有最狡猾的解决方案。

答案 7 :(得分:-1)

接受的答案不适用于我的情况,我的<script> try{ var websocket = new WebSocket("wss://self-signed.badssl.com/"); websocket.onopen = function (event) { }; websocket.onclose = function (event) { var reason; alert(event.code); }; websocket.onmessage = function (event) { }; websocket.onerror = function (event) { }; } catch(err){ document.getElementById("demo").innerHTML = err.message; } </script> <p id="demo"></p> 可能比显示的长度更长,因此需要将其放在ListView内,这会带回空白

我解决此问题的方法是,拥有顶级ScrollView,然后将StackLayout放置在直接ListView中,例如以下XAML:

ScrollView