/// <summary> /// Gets row definition for the specified view. /// </summary> private RowDefinition GetRowDefinition(UIView child) { var cellIndex = Cell.GetValue(child); int rowIndex = cellIndex.Row < Rows.Count ? cellIndex.Row : Rows.Count - 1; var rowDefinition = Rows[rowIndex]; var cellSpan = CellSpan.GetValue(child); if (cellSpan == null || cellSpan.Row <= 1) { return(rowDefinition); } var rowSpacing = RowSpacing ?? (Spacing ?? ElementSize.Default); // calculate new row definition based on row span var spannedRowDefinition = new RowDefinition(rowDefinition); for (int i = 1; i < cellSpan.Row; ++i) { int nextRowIndex = rowIndex + i; if (nextRowIndex >= Rows.Count) { break; } var nextRowDefinition = Rows[nextRowIndex]; // add actual width and spacing of next row spannedRowDefinition.ActualHeight += nextRowDefinition.ActualHeight + rowSpacing; } return(spannedRowDefinition); }
/// <summary> /// Gets column definition for the specified view. /// </summary> private ColumnDefinition GetColumnDefinition(UIView child) { var cellIndex = Cell.GetValue(child); int columnIndex = cellIndex.Column < Columns.Count ? cellIndex.Column : Columns.Count - 1; var columnDefinition = Columns[columnIndex]; var cellSpan = CellSpan.GetValue(child); if (cellSpan == null || cellSpan.Column <= 1) { return(columnDefinition); } var columnSpacing = ColumnSpacing ?? (Spacing ?? ElementSize.Default); // calculate new column definition based on column span var spannedColumnDefinition = new ColumnDefinition(columnDefinition); for (int i = 1; i < cellSpan.Column; ++i) { int nextColumnIndex = columnIndex + i; if (nextColumnIndex >= Columns.Count) { break; } var nextColumnDefinition = Columns[nextColumnIndex]; // add actual width and spacing of next column spannedColumnDefinition.ActualWidth += nextColumnDefinition.ActualWidth + columnSpacing; } return(spannedColumnDefinition); }
private static IList <int> FindOpenerMoves(Board board) { var dimensions = board.Dimensions; // The middle of a board is of highest priority. // account for a multi cell middle, e.g. width = 4, height = 3 => middle is at (1,1) and (2,1) var middleSpan = new CellSpan(1 - dimensions.Width % 2, 1 - dimensions.Height % 2); var step = new CellSpan(1, 1); for ( CellCoordinates topLeft = new CellCoordinates(dimensions.Width / 2, dimensions.Height / 2), bottomRight = topLeft + middleSpan; CellCoordinates.IsInside(topLeft, dimensions) && CellCoordinates.IsInside(bottomRight, dimensions); topLeft -= step, bottomRight += step) { var cells = Cells.TakeAnyFreeCellInRect( board, CellCoordinates.ToCellAt(topLeft, dimensions), CellCoordinates.ToCellAt(bottomRight, dimensions)); // If cells are already occupied, take a cell from the rectangle around the current one, if (cells.Length > 0) { return(cells); } // repeat until a free cell is found. } return(Array.Empty <int>()); }
/// <summary> /// Table Cell /// </summary> /// <param name="boundingBox"></param> /// <param name="content"></param> /// <param name="index"></param> /// <param name="rowSpan"></param> /// <param name="columnSpan"></param> public TableCell(PdfRectangle boundingBox, TextBlock content, int index, CellSpan rowSpan, CellSpan columnSpan) { BoundingBox = boundingBox; Children = new[] { content }; Index = index; RowSpan = rowSpan; ColumnSpan = columnSpan; }
/// <summary> /// 获取cell的CellSpan信息 /// </summary> /// <param name="cell">单元格</param> /// <returns></returns> public static CellSpan GetSpan(this ICell cell) { var cellSpan = new CellSpan(1, 1); if (cell.IsMergedCell) { int regionsNum = cell.Sheet.NumMergedRegions; for (int i = 0; i < regionsNum; i++) { CellRangeAddress range = cell.Sheet.GetMergedRegion(i); if (range.FirstRow == cell.RowIndex && range.FirstColumn == cell.ColumnIndex) { cellSpan.RowSpan = range.LastRow - range.FirstRow + 1; cellSpan.ColSpan = range.LastColumn - range.FirstColumn + 1; break; } } } return(cellSpan); }
/// <summary> /// Contains /// </summary> /// <param name="cellSpan"></param> /// <returns></returns> public bool Contains(CellSpan cellSpan) { return(this.End >= cellSpan.End && this.Start <= cellSpan.Start); }