Самое простое, GridView, в ItemsPanelTemplate, задаем шаблон панели. А тут придется переписать поведение панели. Делаем новой компонент, GamePanel и переопределяем там ArrangeOverride и MeasureOverride, добавляем свойства нужные и тд.
class GamePanel:Panel
{
public int ItemsPerWidth
{
get { return (int)GetValue(ItemWidthProperty); }
set { SetValue(ItemWidthProperty, value); }
}
public static readonly DependencyProperty ItemsPerWidthProperty =
DependencyProperty.Register(nameof(ItemsPerWidth), typeof(int), typeof(GamePanel), new PropertyMetadata(null));
public int ItemsPerHeight
{
get { return (int)GetValue(ItemWidthProperty); }
set { SetValue(ItemWidthProperty, value); }
}
public static readonly DependencyProperty ItemPerHeightProperty =
DependencyProperty.Register(nameof(ItemsPerHeight), typeof(int), typeof(GamePanel), new PropertyMetadata(null));
protected override Size ArrangeOverride(Size finalSize)
{
}
protected override Size MeasureOverride(Size availableSize)
{
}
}
про ArrangeOverride и MeasureOverride
тут
и в Xaml
<GridView ItemsSource="{Binding ShopItems}" ItemContainerStyle="{StaticResource ShopGridViewItemExpanded}" Loaded="GridView_Loaded">
<GridView.ItemsPanel>
<ItemsPanelTemplate>
<controls:GamePanel ItemsPerWidth="4" ItemsPerHeight="4"></controls:VariableHeightPanel>
</ItemsPanelTemplate>
</GridView.ItemsPanel>
<GridView.ItemTemplate>
<DataTemplate>
<Border ..цвет, заливка.......>
<TextBlock ......тут номер />
</Border>
</DataTemplate>
</GridView.ItemTemplate>
</GridView>
вот и все. теперь во вью модели у вас будет коллекция фишек (типа
public class GameItem
{
public int Id { get;set; }
public string Text { get; set;}
public bool IsEmpty {get; set;}
.... ну и далее, например цвет, картинка и тд.
}
public class ViewModel
{
private readonly ObservableCollection<GameItem> _gameItems = new ObservableCollection<GameItem>();
public ObservableCollection<GameItem> GameItems => return _gameItems;
}
естественно можете задать свойства для привязки ItemsPerHeight и ItemsPerWidth.
все просто? новая игра? очищаем коллекцию, заполняем новыми фишками (не забываем про пустую), проверить на конец игры, проходим по списку и смотрим по порядку ли элементы.