Question
J'ai un FlexLayout avec les propriétés suivantes. Chaque fois qu'un élément y est ajouté (sauf le premier), de l'espace supplémentaire est ajouté automatiquement. Comment puis-je me débarrasser de cet espace supplémentaire?
private void Draw() { string[] data = new string[] { "Button1", "Button1", "Button1", "Button1", "Button1", "Button1", "Button1", "Button1", "Button1" }; for (int i = 0; i < 5; i++) { var tempLayout = new StackLayout { Orientation = StackOrientation.Horizontal, VerticalOptions = LayoutOptions.Start }; var fButton = new Button { Text = "B", HorizontalOptions = LayoutOptions.Start, VerticalOptions = LayoutOptions.Start, WidthRequest = 50, HeightRequest = 50 }; tempLayout.Children.Add(fButton); var equals = new Label { Text = "=>", VerticalTextAlignment = TextAlignment.Center, HorizontalTextAlignment = TextAlignment.Center, VerticalOptions = LayoutOptions.Start, WidthRequest = 50, HeightRequest = 50, BackgroundColor = Color.LemonChiffon }; tempLayout.Children.Add(equals); var flexLayout = new FlexLayout { Wrap = FlexWrap.Wrap, JustifyContent = FlexJustify.Start, AlignItems = FlexAlignItems.Center, AlignContent = FlexAlignContent.Start, BackgroundColor = Color.LightYellow, HorizontalOptions = LayoutOptions.FillAndExpand }; foreach (var term in data) { var button = new Button { Text = term, HorizontalOptions = LayoutOptions.Start, VerticalOptions = LayoutOptions.Start, HeightRequest = 36 }; flexLayout.Children.Add(button); var label = new Label { Text = "and", VerticalTextAlignment = TextAlignment.Center, HorizontalTextAlignment = TextAlignment.Center, VerticalOptions = LayoutOptions.Start, HeightRequest = 50, BackgroundColor = Color.LemonChiffon }; flexLayout.Children.Add(label); } //var grid = new Grid { HorizontalOptions = LayoutOptions.StartAndExpand, VerticalOptions = LayoutOptions.Start, BackgroundColor = Color.Red }; //grid.Children.Add(flexLayout); tempLayout.Children.Add(flexLayout); //Grid.SetColumn(tempLayout, 1); //grid.Children.Add(tempLayout); RootPanel.Children.Add(tempLayout); } }
Voici le résultat -
Question détaillée
Mon scénario consiste à ajouter plusieurs Flexlayouts
dans un StackLayout
qui est l'enfant de a ScrollView
.
Tout fonctionne bien sauf que Flexlayouts
prend beaucoup d'espace blanc inutilisé, je veux qu'ils s'adaptent aux enfants.
Jusqu'à présent, j'ai essayé
1. Beaucoup de combinaisons de permutation des propriétés FlexLayout.
2. Mettre Flexlayout
dans StackLayout
/ Grid
avec VerticalOptions
défini sur Start
XAML
<Grid> <ScrollView HorizontalScrollBarVisibility="Never"> <StackLayout x:Name="RootPanel" BackgroundColor="Cyan" Padding="5"/> </ScrollView> </Grid>
C # Code derrière
var flexLayout = new FlexLayout { Wrap = FlexWrap.Wrap, JustifyContent = FlexJustify.Start, AlignItems = FlexAlignItems.Center, AlignContent = FlexAlignContent.Start, BackgroundColor = Color.LightYellow, HorizontalOptions = LayoutOptions.FillAndExpand, VerticalOptions = LayoutOptions.Start };
Le code ci-dessus donne le résultat suivant, la capture d'écran provient d'une application UWP mais le résultat est le même pour Android aussi -
Je m'attends à quelque chose comme ça, il n'y a pas d'espace vide après le tableau de boutons.
3 Réponses :
Marquez la valeur d'espacement StackLayout sur 0. Il existe un espacement par défaut de 10 points. https: // docs. microsoft.com/en-us/dotnet/api/xamarin.forms.stacklayout.spacing?view=xamarin-forms
Le problème n'est pas avec StackLayout, c'est avec FlexLayout.
>> La valeur par défaut est 6,0. et ce n'est pas un problème avec l'espacement entre les éléments
Cause: La disposition parente de FlexLayout est une StackLayout . Et StackLayout correspondra à la taille de son éléments enfants.
Solution: Utilisez Grid au lieu de Stacklayout
private void Draw() { string[] data = new string[] { "Button1", "Button1", "Button1", "Button1", "Button1", "Button1", "Button1", "Button1", "Button1" }; for (int i = 0; i < 5; i++) { var grid = new Grid { BackgroundColor = Color.Green }; grid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) }); grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(50) }); grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(50) }); grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }); var fButton = new Button { Text = "B", HorizontalOptions = LayoutOptions.Start, VerticalOptions = LayoutOptions.Start, WidthRequest = 50, HeightRequest = 50 }; grid.Children.Add(fButton, 0, 0); var equals = new Label { Text = "=>", VerticalTextAlignment = TextAlignment.Center, HorizontalTextAlignment = TextAlignment.Center, VerticalOptions = LayoutOptions.Start, WidthRequest = 50, HeightRequest = 50, BackgroundColor = Color.LemonChiffon }; grid.Children.Add(equals, 1, 0); var flexLayout = new FlexLayout { Wrap = FlexWrap.Wrap, JustifyContent = FlexJustify.SpaceAround, AlignItems = FlexAlignItems.Start, AlignContent = FlexAlignContent.Start, BackgroundColor = Color.Red, HorizontalOptions = LayoutOptions.FillAndExpand, }; foreach (var term in data) { var button = new Button { Text = term, HorizontalOptions = LayoutOptions.Start, VerticalOptions = LayoutOptions.Start, HeightRequest = 36 }; flexLayout.Children.Add(button); var label = new Label { Text = "and", VerticalTextAlignment = TextAlignment.Center, HorizontalTextAlignment = TextAlignment.Center, VerticalOptions = LayoutOptions.Start, HeightRequest = 50, BackgroundColor = Color.LemonChiffon }; flexLayout.Children.Add(label); } grid.Children.Add(flexLayout, 2, 0); RootPanel.Children.Add(grid); } }
Merci Lucas. Cela résout le problème de l'espace vide, cependant, si vous ajoutez plus de boutons à FlexLayout, ils sont rendus en dehors des limites de FlexLayout et sont masqués ou non cliquables. Utilisez simplement string [] data = new string [] {"Button1", "Button2", "Button3", "Button4", "Button5", "Button6", "Button7", "Button8", "Button9" , "Button0", "Button11", "Button12", "Button13", "Button14", "Button15", "Button16", "Button17", "Button18", "Button19", "Button20"};
grid.RowDefinitions.Add (new RowDefinition {Height = new GridLength (1, GridUnitType.Auto)});
Je me sens gêné en demandant même cela. Oui, cela devrait être Auto
. Il fonctionne comme un charme. Merci.
N'utilisez pas GRID dans Flex Layout, cela donnera un énorme ESPACE BLANC, utilisez plutôt StackLayout
Essayez également de définir
VerticalOptions = Start
pourflexLayout
etHorizontalOptions
.FlexLayout
est destiné aux textes s'étendant sur leur prémisse, puisque vous avez utiliséHorizontalOptions = FillAndExpand
, il s'agrandit complètement pour l'espace restant@Prateek J'ai mis à jour la question avec le résultat du réglage
VerticalOptions = Start
. De plus, définirHorizontalOptions = Start
ne fait que tout jeter sur une ligne verticale, ce qui est un peu attendu.Vérifiez la réponse