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 StackLayout
s 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 Start
et 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 )
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
J'ai rencontré le même problème, et pour moi cela a fonctionné comme un charme:
listView.HasUnevenRows = true;
Le code ci-dessous a fonctionné pour moi,
protected override void OnAppearing()
{
base.OnAppearing();
listViewOrderCloths.HeightRequest = model.ListOrderedCloths.Count*100)/2 ;
}
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!
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/
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.
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>