Подтвердить что ты не робот

Xamarin.Forms: ListView внутри StackLayout: как установить высоту?

В ContentPage у меня есть ListView внутри a StackLayout внутри a ScrollView. Заполняется ListView (ItemSource) в ContentPage, когда OnAppearing получает вызов, и я вижу, что список заполняется в эмуляторе. Ориентация StackLayout Vertical, а ниже ListView у меня есть Button.

Моя проблема в том, что независимо от того, сколько элементов имеет элемент ListView, он получает высоту 53.33. Я бы хотел, чтобы высота ListView соответствовала общей высоте элементов в ней. Установив HeightRequest, я могу установить высоту ListView на все, что захочу, но поскольку я не знаю высоту элементов внутри ListView, результат чаще всего таков, что расстояние до кнопки под ним неверно и поэтому выглядит уродливым. Я попытался установить VerticalOptions как на ListView, так и на StackLayout на Start и другие параметры, но это не изменит высоту с 53.33 (и если я попытаюсь объединить с помощью HeightRequest и Start получается, что выигрывает HeightRequest).

Как я могу это решить?

(пожалуйста, извините перекрестное сообщение из форум Xamarin)

4b9b3361

Ответ 1

Решение в моем случае состояло в том, чтобы поместить ListView внутрь a 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.

Смотрите сообщение на этом форуме форума Xamarin для получения дополнительной информации

Ответ 3

С новой функцией BindableLayout в Xamarin 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/

Ответ 4

Ниже код работал у меня,

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

Ответ 5

У меня была та же проблема, и это было единственное, что я сделал для меня (в XAML):

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

Надеюсь, что это сработает!

Ответ 6

У меня была подобная борьба, с немного другим решением. Во-первых, установка RowHeight в ListView казалась ключевой. Во-вторых, я столкнулся с проблемой привязки + времени. Если ListView был отображен и не содержал содержимого, он был установлен на высоту по умолчанию (показывая пустое пространство). Если бы я отошел от этой страницы и вернулся, размер был в порядке.

Итак, мой подход заключался в привязке видимости ListView к присутствию (или отсутствию) чего-то связанного. Затем, когда данные вернулись, ListView стал видимым и имел правильный размер.

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

Ответ 7

На Android моя таблица, созданная в коде, оставляла пробелы выше и ниже.

Это исправило это...

HeightRequest="1000000"

Я думаю, что у меня есть самое хакерское решение.

Ответ 8

Принятый ответ не применим к моей ситуации, когда мой ListView может быть длиннее, чем длина экрана, поэтому его необходимо поместить в ScrollView, который возвращает пустое пространство.

Как я решил, они должны были иметь StackLayout верхнего уровня, а затем поместить ListView в немедленный ScrollView, как в следующем 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 >