Xamarin.Formulaires: ListView inside StackLayout: comment définir la hauteur?
Dans a ContentPage
j'ai un ListView
dans a StackLayout
dans a ScrollView
. Le ListView
est rempli (ItemSource
est défini) dans le ContentPage
lorsque OnAppearing
est appelé et je vois que la liste est renseignée dans l'émulateur. L'orientation StackLayout
s est Vertical
et en dessous du ListView
j'ai un Button
.
Mon problème est que peu importe combien d'éléments le ListView
A, il obtient la hauteur de 53.33. Je voudrais que la hauteur du ListView
corresponde à la hauteur totale des éléments qu'il contient. En définissant HeightRequest
, je peux définir la hauteur de le ListView
à tout ce que je veux, mais comme je ne connais pas la hauteur des éléments à l'intérieur du ListView
le résultat est le plus souvent que la distance au bouton ci-dessous est incorrecte et semble donc moche. J'ai essayé de mettre des VerticalOptions
sur le ListView
et le StackLayout
à Start
et d'autres paramètres, mais cela ne change pas la hauteur de 53.33 (et si j'essaie de combiner à l'aide de HeightRequest
et Start
, il s'avère que HeightRequest l'emporte).
Comment puis-je résoudre cela?
(veuillez excuser le la croix-affichage à partir de Xamarin forum)
6 réponses
La solution dans mon cas était de mettre les ListView
dans a StackLayout
et ensuite mettre cette StackLayout
dans le StackLayout
. Ensuite, je pourrais définir le VerticalOptions = LayoutOptions.FillAndExpand
sur le StackLayout
interne (celui contenant le ListView
) avec le résultat que le ListView
A l'espace nécessaire (ce qui varie bien sûr 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é un nouveau StackLayout
avec le seul but de mettre les ListView
à l'intérieur. Ensuite, je mets que listStackLayout
dans le principal _stackLayout
.
Voir le post sur ce forum Xamarin post 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'était la seule chose que j'ai faite qui a résolu pour moi (en XAML):
<StackLayout Orientation="Vertical"
VerticalOptions="Fill"
HorizontalOptions="StartAndExpand">
<ListView VerticalOptions="FillAndExpand"
RowHeight="<some row height>">
</ListView>
</StackLayout>
J'espère que ça marche!
J'ai eu une lutte similaire, avec une solution légèrement différente. Tout d'abord, définir un RowHeight sur le ListView semblait être essentiel. Deuxièmement, je rencontrais un problème de liaison + timing. Si le ListView était affiché et n'avait pas de contenu, il était défini sur une hauteur par défaut (montrant l'espace vide). Si je me suis éloigné de cette page et que je suis revenu, la taille était bonne.
Donc, mon approche était de lier la visibilité de ListView à la présence (ou à l'absence) de quelque chose. Puis, quand les données sont revenues, le ListView est devenu visible et avait la bonne taille.
<ListView x:Name="lvSettlements" ItemsSource="{Binding RecentSettlements}" VerticalOptions="FillAndExpand" RowHeight="25" IsVisible="{Binding RecentSettlements, Converter={StaticResource nullConverter}}">
...SNIP...
</ListView>
Sur Android, ma table créée dans le code laissait des lacunes au-dessus et au-dessous.
Cela l'a réparé...
HeightRequest="1000000"
Je pense que j'ai la solution la plus hackée.