У меня есть сетка, в которую я добавляю еще TileView. но это просто рендеринг в первой строке и столбце (перекрывая друг друга). Я хочу, чтобы каждая новая «плитка» отображалась в новой строке и / или столбце. Может быть, это не лучший способ сделать это. Если вы, ребята, знаете, как добиться того, что я пытаюсь сделать, дайте мне знать.
MoreTilePage.xaml
<ContentPage.Content>
<ScrollView>
<StackLayout x:Name = "MoreTileViewHolder" />
<ScrollView>
</ContentPage.Content>
MoreTilePage.xaml.cs
public partial class MoreTilePage : ContentPage
{
public MoreTilePage()
{
InitializeComponent();
var items = PixelApp.Platform.AppContext.Instance.moreViewModel?.Items;
Grid myGrid = new Grid();
myGrid.HorizontalOptions = LayoutOptions.FillAndExpand;
myGrid.Padding = new Thickness(10);
myGrid.RowDefinitions = new RowDefinitionCollection
{
new RowDefinition { Height = new GridLength(220) },
new RowDefinition { Height = new GridLength(220) },
new RowDefinition { Height = new GridLength(220) },
new RowDefinition { Height = new GridLength(220) },
new RowDefinition { Height = new GridLength(220) }
};
myGrid.ColumnDefinitions = new ColumnDefinitionCollection
{
new ColumnDefinition { Width = GridLength.Star },
new ColumnDefinition { Width = GridLength.Star }
};
int iColumn = 0;
int iRow = 0;
int iItem = 1;
foreach (MoreModel model in items)
{
if (iItem > 2)
{
iItem = 1;
iRow++;
}
model.row = iRow;
model.column = iColumn;
var tile = new MoreTileView(model);
myGrid.Children.Add(tile);
iItem++;
if (iColumn == 0)
iColumn = 1;
else
iColumn = 0;
}
MoreTileViewHolder.Children.Add(myGrid);
}
}
Подробнее
<ContentView.Content>
<Frame Grid.Column = "{Binding column}" Grid.Row = "{Binding row}" Margin = "0" HasShadow = "True" BackgroundColor = "LightGray" IsClippedToBounds = "True" CornerRadius = "10" Padding = "0">
<Grid>
<ffimageloading:CachedImage Source = "{Binding image}" Aspect = "AspectFill" />
<ffimageloading:CachedImage Source = "https://www.fisher-price.com/resources/animations/Imaginext/meetcharacters/images/kids_bkg-grey-grad.png" Aspect = "Fill" />
<BoxView HeightRequest = "3" BackgroundColor = "HotPink" VerticalOptions = "End" HorizontalOptions = "Start" WidthRequest = "70" Margin = "10,10,10,60" />
<Label Text = "{Binding headline}" TextColor = "White" VerticalOptions = "End" Margin = "10,10,10,10" />
</Grid>
</Frame>
</ContentView.Content>
MoreModel.cs
public class MoreModel
{
public int id { get; set; }
public int appId { get; set; }
public int sort { get; set; }
public string headline { get; set; }
public string description { get; set; }
public string image { get; set; }
public string link { get; set; }
public int column { get; set; }
public int row { get; set; }
}
Пух ... Есть много недостатков.
1. Зачем помещать сетку в стек как ее единственный дочерний элемент? Просто поместите сетку прямо в область прокрутки. Поэтому MoreTileViewHolder.Children.Add(myGrid);
бесполезен. Просто замените <StackLayout x:Name = "MoreTileViewHolder" />
на `.
2. Вы добавляете все свои «мозаичные» объекты в столбец 0 и строку 0 сетки myGrid.Children.Add(tile)
.
Вы должны указать строку и сетку при добавлении, иначе они окажутся в одном месте.
myGrid.Children.Add(tile, iColumn, iRow)
похоже, что это то, что вы намереваетесь.
Я знаю, что вы пытаетесь сделать это с помощью привязок к Grid.Column и Grid.Row-Properties. Но я думаю, это не обновляет представление. Я предполагаю, что эти свойства изменены не в тот момент времени, поэтому добавление их в сетку не повлияет.
Несмотря на это, вы должны показать нам свой класс «MoreModel». Также может быть, что вы неправильно используете BindableProperties, поэтому Grid.Column = "{Binding column}"
на Frame
просто никогда не возникает.
3. Не изобретайте велосипед. Последняя версия xamarin включает «FlexLayout», который, как мне кажется, выполняет то, что вы собираетесь здесь создать. Xamarin FlexLayout
Я не понимаю "2. Вы добавляете все свои объекты" плитки "в столбец 0 и строку 0 сетки myGrid.Children.Add (tile).", Почему? Я просматриваю все элементы и настройки: model.row = iRow; model.column = iColumn; и привязки также должны быть правильными, поскольку я правильно понимаю заголовок на этикетке.
Но текст заголовка относится к самой этикетке. Привязка Grid.Row относится к родительскому объекту (myGrid) и может быть установлена слишком рано / слишком поздно, поэтому значения не применяются. Тем не менее, почему вы связываете эти ценности? Они у вас есть прямо здесь, когда вы добавляете представления в сетку.
Я не понимаю "2. Вы добавляете все свои объекты" плитки "в столбец 0 и строку 0 сетки myGrid.Children.Add (tile).", Почему? Я перебираю все элементы и настройки:
model.row = iRow;
model.column = iColumn;
и привязки также должны быть правильными, поскольку я правильно понимаю заголовок на этикетке.
Я установил красный цвет фона сетки и по-прежнему НИЧЕГО не вижу. Xamarin отстой