2016-08-09 1 views
1

J'ai un ListView dans mon application Xamarin, définie comme ceci:Comment puis-je obtenir un Xamarin ListView pour dimensionner automatiquement ses lignes sans redimensionner l'écran?

 listView = new ListView 
     { 
      HorizontalOptions = LayoutOptions.Fill, 
      HasUnevenRows = true, 
      RowHeight = -1, 
      ItemTemplate = new DataTemplate(() => 
      { 
       var nameLabel = new Label 
       { 
        VerticalOptions = LayoutOptions.Center, 
        HorizontalTextAlignment = TextAlignment.Start 
       }; 
       nameLabel.SetBinding(Label.TextProperty, "DisplayName"); 

       var statusLabel = new Label 
       { 
        VerticalOptions = LayoutOptions.Center, 
        HorizontalTextAlignment = TextAlignment.End 
       }; 
       statusLabel.SetBinding(Label.TextProperty, "Status"); 

       var grid = new Grid 
       { 
        HorizontalOptions = LayoutOptions.Fill, 
        RowDefinitions = { 
         new RowDefinition { Height = GridLength.Auto } 
        }, 
        ColumnDefinitions = { 
         new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }, 
         new ColumnDefinition { Width = GridLength.Auto } 
        } 
       }; 

       grid.Children.Add(nameLabel, 0, 0); 
       grid.Children.Add(statusLabel, 1, 0); 

       return new ViewCell 
       { 
        View = grid 
       }; 
      }) 
     }; 

Quand je mis sa propriété ItemsSource, les lignes sont coupées comme ceci:

ListView with clipped rows

Si je redimensionnez la écran, ils se redimensionnée à la taille correcte:

ListView with resized rows

Si je change à nouveau ItemsSource, ils reviennent à être écrêtés. L'appel UpdateChildrenLayout ou ForceLayout n'a aucun effet.

Comment puis-je obtenir le ListView pour dimensionner ses lignes correctement, sans avoir à demander à l'utilisateur de redimensionner leur fenêtre? Cela va être une question difficile sur mobile!

Répondre

2

Si le ListView est un plein écran, définissez VerticalOptions=FillAndExpand. Ne définissez pas le RowHeight de manière statique. Étant donné que vous avez HasUnevenRows=true, la taille des lignes différentes serait différente en fonction de la taille du contenu qui s'y trouve. Fournissez également le VerticalOptions pour les contrôles à l'intérieur du ItemTemplate de listview, afin qu'ils soient dimensionnés correctement.