Как я могу заставить мой ListView потреблять как можно меньше места в Xamarin.Forms

Я работаю над страницей, для которой требуются вложенные ListViews. Я заметил, что мой макет искажается ListView в StackLayout, который занимает гораздо больше места, чем требуется для записей.

Как оказалось, даже без каких-либо записей в xamarin ListView занимает гораздо больше места, чем ему могло бы понадобиться.

Кто-нибудь знает, как избавиться от этого поведения?

WPF (который отлично работает):

рендеринг wpf

    <StackPanel Background="Green">
        <Label Content="hi" Background="Aqua"></Label>
        <ListView Background="Red"></ListView>
    </StackPanel>

Ксамарин:

рендеринг xamarin

public class CustomListView : ListView
{

    public override SizeRequest GetSizeRequest(double widthConstraint, double heightConstraint)
    {
        var sizeRequest = base.GetSizeRequest(widthConstraint, heightConstraint);
        var b = this.Behaviors;
        return sizeRequest;
    }
}

public class App : Application
{
    public App()
    {
        // The root page of your application
        MainPage = new ContentPage
        {
            BackgroundColor = Color.Green,
            Content = new StackLayout
            {
                VerticalOptions = LayoutOptions.Start,
                BackgroundColor = Color.Aqua,
                Children = {
                    new Label {
                        XAlign = TextAlignment.Center,
                        Text = "Welcome to Xamarin Forms!"
                    }, new CustomListView()
                    {
                        BackgroundColor = Color.Red,
                        VerticalOptions = LayoutOptions.Start
                    }
                }
            }
        };
    }
}

В WPF вы можете увидеть ожидаемый результат, если ListView отображается в StackLayout - до сих пор я не смог измерить дочерние элементы и соответственно вернуть SizeRequest, чтобы исправить это.

В то время как некоторые другие элементы реализуют ILayoutController, ListView — нет.


person Dbl    schedule 31.05.2016    source источник


Ответы (2)


StackLayout в Xamarin.Forms пытается заполнить столько места, сколько предоставлено родительским элементом. Вы можете получить дополнительную информацию об этом в здесь .

Следовательно, в коде вы можете попытаться контролировать высоту либо ListView, либо StackLayout, используя либо HorizontalOptions, либо VerticalOptions.

new StackLayout
{
    Children =
    {
        new CustomListView()
        {
           BackgroundColor = Color.Red,
           VerticalOptions = LayoutOptions.Start,
           HeightRequest = 100 // Can be used even in ListView
        }
    },
    HeightRequest = 100 // Can be used even in StackLayout
}

Это вывод, который я получаю при настройке HeightRequest в любом случае. Вывод приведенного выше фрагмента кода

person Anubhav Ranjan    schedule 01.06.2016
comment
установка высоты вручную не вариант. я думаю, это просто плохая реализация, тогда, если она не ведет себя так, как в WPF, тогда... если бы я хотел, чтобы она заполнила пространство, я бы использовал сетку - person Dbl; 02.06.2016
comment
также, если я заменю список на метку, он не будет использовать оставшуюся высоту в родительском элементе. так что в этом случае это просто просмотр списка - person Dbl; 02.06.2016

ScrollView может вести себя так, как вы хотите. Если вы замените ListView на ScrollView на VerticalOptions="Start", то он займет столько места, сколько вам нужно, и станет прокручиваемым, если ему нужно больше. Вы можете получить аналогичную функциональность как ListView с StackLayout с BindableLayout.ItemTemplate.

<ScrollView VerticalOptions="Start">
        <StackLayout
                BindableLayout.ItemsSource="{Binding YourProperty}">
                <BindableLayout.ItemTemplate>
                        <DataTemplate>
                                <!-- your elements -->
                        </DataTemplate>
                </BindableLayout.ItemTemplate>
        </StackLayout>
</ScrollView>

Примечание. Установка VerticalOptions="Start" явно не требуется, в некоторых случаях родитель уже сделал это за вас (например, если родителем является Grid).

Соответствующая часть из документов xamarin:

В вертикальном ScrollView не устанавливайте для свойства VerticalOptions значение Start, Center или End. Это говорит о том, что ScrollView должен быть ровно настолько, насколько это необходимо, что может быть равно нулю. Хотя Xamarin.Forms защищает от таких ситуаций, лучше избегать кода, который предполагает что-то, чего вы не хотите.

person benk    schedule 10.06.2021