#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. Спасибо вам всем, очень помогли.