1
votes

Supprimer l'espace supplémentaire de FlexLayout

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 -

 entrez la description de l'image ici

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 -

 entrez la description de l'image ici

Je m'attends à quelque chose comme ça, il n'y a pas d'espace vide après le tableau de boutons.

 entrez la description de l'image ici


3 commentaires

Essayez également de définir VerticalOptions = Start pour flexLayout et HorizontalOptions . 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éfinir HorizontalOptions = Start ne fait que tout jeter sur une ligne verticale, ce qui est un peu attendu.


Vérifiez la réponse


3 Réponses :


0
votes

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


2 commentaires

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



1
votes

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);
  }
}

 entrez la description de l'image ici


3 commentaires

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.



0
votes

N'utilisez pas GRID dans Flex Layout, cela donnera un énorme ESPACE BLANC, utilisez plutôt StackLayout


0 commentaires