//TODO: Maybe make another parent element so all this can be done without locking the UI thread until the end private void BuildBingoGrid() { //remove the old grid if there is one if (BingoGrid.Children.Count > 0) { BingoGrid.Children.Clear(); } var gridColumns = new List <ColumnDefinition>(); var gridRows = new List <RowDefinition>(); GridHelper.CalculateGridSizes(BingoGrid, BingoTileDefs.Width, BingoTileDefs.Height); BingoGrid.HorizontalAlignment = HorizontalAlignment.Center; BingoGrid.VerticalAlignment = VerticalAlignment.Center; double colWidth = BingoGrid.Width / BingoTileDefs.Width; double rowHeight = BingoGrid.Height / BingoTileDefs.Height; for (int x = 0; x < BingoTileDefs.Width; ++x) { ColumnDefinition column = new ColumnDefinition(); gridColumns.Add(column); } foreach (var col in gridColumns) { col.Width = new GridLength(colWidth); BingoGrid.ColumnDefinitions.Add(col); } for (int y = 0; y < BingoTileDefs.Height; ++y) { RowDefinition row = new RowDefinition(); gridRows.Add(row); } foreach (var row in gridRows) { row.Height = new GridLength(rowHeight); BingoGrid.RowDefinitions.Add(row); } var defs = BingoTileDefs.Tiles; if (FindResource("BingoTileTemplate") is ControlTemplate tileTemplate) { BingoTileDef def = null; UpgradeGridControls.Clear(); for (int x = 0; x < BingoTileDefs.Width; ++x) { for (int y = 0; y < BingoTileDefs.Height; ++y) { BingoTileData tileData = new BingoTileData(); if (defs.GetLength(0) > x && defs.GetLength(1) > y) { def = defs[x, y]; tileData.TileDef = def; } Control gridTile = new Control { Template = tileTemplate }; tileData.Height = rowHeight; tileData.Width = colWidth; tileData.X = x; tileData.Y = y; tileData.ImgVisible = IsBingoTileVisible(tileData); gridTile.DataContext = tileData; Grid.SetRow(gridTile, y); Grid.SetColumn(gridTile, x); BingoGrid.Children.Add(gridTile); if (tileData.TileDef != null && tileData.TileDef.Type == BingoTileType.Upgrade) { UpgradeGridControls.Add(gridTile); } } } } else { ErrorTracker.CurrentError = "Could not find bingo tile template"; } }