Xamarin.Формы Вставляют строку в Сетку и переупорядочивают

#c# #xamarin.forms #grid

#c# #xamarin.forms #сетка

Вопрос:

Я пытаюсь вставить новый объект в существующую сетку в строке 0 (сдвигая оставшиеся строки на одну ниже). Есть ли способ сделать это? Аналогично журналу, последний элемент находится на первой позиции. Обратите внимание, что я не могу использовать ListView, у меня уже есть один в содержимом. Кроме того, я бы предпочел использовать сетку, поскольку я могу лучше структурировать ее для презентации и т.д. Готовая структура сетки:

 > <Grid.RowDefinitions>
>     <RowDefinition Height="*"/> </Grid.RowDefinitions>

> <Grid.ColumnDefinitions>
>      <ColumnDefinition/>
>      <ColumnDefinition/>
>      <ColumnDefinition/>  
</Grid.ColumnDefinitions>
> (existing Labels)
> <Label Text="1" Grid.Column="0" Grid.Row="0"/> 
<Label Text="2" Grid.Column="0" Grid.Row="0"/> 
> <Label Text="3", Grid.Column="0", Grid.Row="0"/>
>  </>
  

Я генерирую сетку программно, чтобы заполнить приведенную выше структуру (повторите номер столбца / строк), затем попытайтесь вставить верхнюю строку с дочерним элементом:

 MyGrid.RowDefinitions.Insert(0,newDefinition); // Insert new row

               

>  MyGrid.Children.Add(new Label
>                         {
>               Text = "original row",
>                             TextColor = Color.Black,
>                             LineBreakMode = Xamarin.Forms.LineBreakMode.WordWrap,
>                             HorizontalTextAlignment = TextAlignment.End,
>                             FontSize = Device.GetNamedSize(NamedSize.Small, typeof(Label)),
>                         }, 0, 0); //Column / Row
  

 > MyGrid.RowDefinitions.Insert(0,newDefinition); // Insert new row
> at 0 row index
> 
> 
>                         MyGrid.Children.Add(new Label
>                         {
>               Text = "new row",
>                             TextColor = Color.Black,
>                             LineBreakMode = Xamarin.Forms.LineBreakMode.WordWrap,
>                             HorizontalTextAlignment = TextAlignment.End,
>                             FontSize = Device.GetNamedSize(NamedSize.Small, typeof(Label)),
>                         }, 0, 0); //Column / Row
  

«новая строка» будет перекрывать «исходную строку».

РЕДАКТИРОВАТЬ: До сих пор это то, что я делал. Это только для одного сдвига строки, без сдвига столбца.

Я не смог получить дочерний столбец / строку сетки с помощью

var left = Grid.Children[0].Left();//Experimental flag Поэтому мне придется повторять больше.

… добавьте новые строки с метками, 0 столбцов (по умолчанию в сетке 1 столбец, 1 сетка), затем:

 Grid.RowDefinitions.Add(newRow); 

for (int i = Grid.Children.Count -1 ; i >= 0; i--) 
{ 
     var child = > Grid.Children[i]; 
     Grid.Children.RemoveAt(i); 
     Grid.Children.Add(child, 0, i  1); 
} 
Grid.Children.Add(SomeLabel, 0, 0);
  

Ответ №1:

Чтобы сдвинуть все строки в сетке на одну, можно использовать методы Grid.GetRow() и Grid.SetRow() , подобные приведенному ниже образцу кода.

 foreach (var child in grid.Children)
{
    var row = Grid.GetRow(child);
    Grid.SetRow(child, row   1);
}
  

Ответ №2:

Вы можете поместить вас Label в List , а затем достичь этого.

Например, если я хочу добавить метку в первую строку и во второй столбец, здесь запускается GIF.

введите описание изображения здесь

Вот мой макет сетки.

 <StackLayout Margin="10">
      
        <Button Text="add" Clicked="Button_Clicked"></Button>
        <Grid x:Name="MyGrid">
          <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
          </Grid.RowDefinitions>
          <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
    </Grid>
</StackLayout>
  

Вот мой фоновый код макета. Я добавляю три Label s в List , затем добавляю элементы из списка в Grid . при нажатии кнопки добавьте новую Label в строку 0, столбец 1, позиция в listview равна 1.

 public partial class MainPage : ContentPage
{
    List<Label> labels;

    public MainPage()
    {
        InitializeComponent();
        labels = new List<Label>();
        labels.Add(new Label
        {
            Text = "1",
          
            LineBreakMode = Xamarin.Forms.LineBreakMode.WordWrap,
            HorizontalTextAlignment = TextAlignment.End,
            FontSize = Device.GetNamedSize(NamedSize.Small, typeof(Label)),
        });
        labels.Add(new Label
        {
            Text = "2",

            LineBreakMode = Xamarin.Forms.LineBreakMode.WordWrap,
            HorizontalTextAlignment = TextAlignment.End,
            FontSize = Device.GetNamedSize(NamedSize.Small, typeof(Label)),
        });
        labels.Add(new Label
        {
            Text = "3",

            LineBreakMode = Xamarin.Forms.LineBreakMode.WordWrap,
            HorizontalTextAlignment = TextAlignment.End,
            FontSize = Device.GetNamedSize(NamedSize.Small, typeof(Label)),
        });

        for (int i=0; i<labels.Count ;i  )
        {
            //If we set the three columns, we can set the Column and  Row by i%3 i/3
            MyGrid.Children.Add(labels[i],i%3,i/3);
        }
    }
    
    private void Button_Clicked(object sender, EventArgs e)
    {
        // Remove the data in the original Gird
        for (int i = 0; i < labels.Count; i  )
        {
            if (MyGrid.Children.Count>0)
            {
                var label = labels[i];

                if (label != null)
                {
                    MyGrid.Children.Remove(label) ;
                }
            }
        }

        // add label
        var newLabel = new Label
        {
            Text = "new row",
            TextColor = Color.Black,
            LineBreakMode = Xamarin.Forms.LineBreakMode.WordWrap,
            HorizontalTextAlignment = TextAlignment.End,
            FontSize = Device.GetNamedSize(NamedSize.Small, typeof(Label)),
        };

        // If I want add a label in the first row and second Column place, I can add the new label to with `Insert` method in List.
        labels.Insert(1,newLabel);

        // re-add the list data to grid.
        for (int i = 0; i < labels.Count; i  )
        {
            MyGrid.Children.Add(labels[i], i % 3, i / 3);
        }
    }
}
  

Комментарии:

1. Спасибо вам всем, очень помогли.