web-dev-qa-db-fra.com

Xamarin.Forms: ListView dans StackLayout: Comment définir la hauteur?

Dans un ContentPage j'ai un ListView dans un StackLayout dans un ScrollView. La ListView est remplie (ItemSource est définie) dans la ContentPage lorsque OnAppearing est appelé et que la liste est remplie dans l'émulateur. L'orientation StackLayouts est Vertical et inférieure à ListView j'ai Button.

Mon problème est que peu importe le nombre d’éléments de la ListView, sa hauteur est de 53,33. J'aimerais que la hauteur de la variable ListView corresponde à la hauteur totale des éléments qu'elle contient. En définissant HeightRequest, je peux définir la hauteur de la ListView sur tout ce que je veux, mais comme je ne connais pas la hauteur des éléments à l'intérieur de la ListView, le résultat est le plus souvent que la distance au bouton situé en dessous est incorrecte et, par conséquent, très laide. J'ai essayé de définir VerticalOptions à la fois sur ListView et sur StackLayout sur Startet d'autres paramètres, mais cela ne modifie pas la hauteur à partir de 53.33 (et si j'essaie de combiner en utilisant HeightRequest et Start, il s'avère que HeightRequest gagne).

Comment puis-je résoudre ça?

(veuillez excuser l'envoi croisé de forum Xamarin )

30
Halvard

La solution dans mon cas était de mettre la ListView dans une StackLayout et ensuite de placer cette StackLayout dans la StackLayout principale. Ensuite, je pouvais définir le VerticalOptions = LayoutOptions.FillAndExpand sur la StackLayout intérieure (celle contenant la ListView) avec pour résultat que la ListView disposait de l’espace nécessaire (qui varie bien entendu en fonction des données).

Voici le code principal:

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

Comme vous le voyez, j’ai ajouté une nouvelle StackLayout dans le seul but de placer la ListView à l’intérieur. Ensuite, je mets cette listStackLayout dans le _stackLayout principal.

Voir l'article sur cet article sur le forum Xamarin pour plus d'informations

16
Halvard

J'ai rencontré le même problème, et pour moi cela a fonctionné comme un charme:

listView.HasUnevenRows = true;

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

10
Norbor Illig

Le code ci-dessous a fonctionné pour moi,

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

J'ai eu le même problème et c'est la seule chose que j'ai résolue (en XAML):

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

Esperons que ça marche!

6
Marcio Martins

Avec la nouvelle fonctionnalité BindableLayout de Xamarin Forms 3.5, vous pouvez facilement utiliser ItemsSource sur StackPanel.

Donc, fondamentalement, vous pouvez écrire quelque chose comme ceci:

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

Vous pouvez en savoir plus à ce sujet ici: https://blog.xamarin.com/xamarin-forms-3-5-a-little-bindable-love/

0
mehrandvd

Sur Android, ma table créée dans le code laissait des espaces au-dessus et au-dessous. 

Cela a résolu le problème ...

HeightRequest="1000000"

Je pense avoir la solution la plus compliquée.

0
Ian Warburton

J'ai eu un combat similaire, avec une solution légèrement différente. Premièrement, définir RowHeight sur ListView semblait être essentiel. Deuxièmement, je rencontrais un problème contraignant + de timing. Si ListView était affiché et ne contenait aucun contenu, sa hauteur par défaut (affichage de l'espace vide) était définie. Si je m'éloignais de cette page et que je revenais, la taille était bonne.

Donc, mon approche consistait à lier la visibilité de ListView à la présence (ou au manque de) quelque chose lié. Ensuite, lorsque les données sont revenues, le ListView est devenu visible et avait la taille appropriée. 

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