public static GridBox GetComputedGridBoxContainingRect(Rect rect, GridElement grid) { int columnBeforePosition = grid.GetComputedColumnBeforePosition(rect.Left); int columnAfterPosition = grid.GetComputedColumnAfterPosition(rect.Right); int rowBeforePosition = grid.GetComputedRowBeforePosition(rect.Top); int rowAfterPosition = grid.GetComputedRowAfterPosition(rect.Bottom); if (columnAfterPosition > columnBeforePosition + 1 && rect.Right < grid.GetComputedPositionOfColumn(columnAfterPosition - 1) + grid.GetComputedColumnWidth(columnAfterPosition - 1) / 2.0) { --columnAfterPosition; } if (columnAfterPosition > columnBeforePosition + 1 && rect.Left > grid.GetComputedPositionOfColumn(columnBeforePosition) + grid.GetComputedColumnWidth(columnBeforePosition) / 2.0) { ++columnBeforePosition; } if (columnAfterPosition == columnBeforePosition + 1 && columnAfterPosition < grid.ColumnDefinitions.Count && grid.GetComputedPositionOfColumn(columnAfterPosition) < (rect.Left + rect.Right) / 2.0) { ++columnBeforePosition; ++columnAfterPosition; } if (rowAfterPosition > rowBeforePosition + 1 && rect.Bottom < grid.GetComputedPositionOfRow(rowAfterPosition - 1) + grid.GetComputedRowHeight(rowAfterPosition - 1) / 2.0) { --rowAfterPosition; } if (rowAfterPosition > rowBeforePosition + 1 && rect.Top > grid.GetComputedPositionOfRow(rowBeforePosition) + grid.GetComputedRowHeight(rowBeforePosition) / 2.0) { ++rowBeforePosition; } if (rowAfterPosition == rowBeforePosition + 1 && rowAfterPosition < grid.RowDefinitions.Count && grid.GetComputedPositionOfRow(rowAfterPosition) < (rect.Top + rect.Bottom) / 2.0) { ++rowBeforePosition; ++rowAfterPosition; } return(new GridBox(columnBeforePosition, columnAfterPosition, rowBeforePosition, rowAfterPosition)); }
public void AddHorizontalGridline(GridElement grid, double position) { using (SceneEditTransaction editTransaction = grid.ViewModel.CreateEditTransaction(StringTable.UndoUnitAddGridline)) { using (grid.ViewModel.ForceBaseValue()) { List <LayoutCacheRecord> currentRects = this.GetCurrentRects((BaseFrameworkElement)grid); int rowBeforePosition = grid.GetComputedRowBeforePosition(position); double computedPositionOfRow1 = grid.GetComputedPositionOfRow(rowBeforePosition); double computedPositionOfRow2 = grid.GetComputedPositionOfRow(rowBeforePosition + 1); bool flag = grid.RowDefinitions.Count == 0 || grid.RowDefinitions[rowBeforePosition].Height.IsStar; grid.CacheComputedRowHeights(); this.EnsureOneRow(grid); grid.RowDefinitions.Insert(rowBeforePosition + 1, RowDefinitionNode.Factory.Instantiate(grid.ViewModel)); position = Math.Max(position, computedPositionOfRow1); if (position > computedPositionOfRow2) { grid.ComputedRowHeightCache[rowBeforePosition] = computedPositionOfRow2 - computedPositionOfRow1; grid.ComputedRowHeightCache.Insert(rowBeforePosition + 1, position - computedPositionOfRow2); } else { grid.ComputedRowHeightCache[rowBeforePosition] = position - computedPositionOfRow1; grid.ComputedRowHeightCache.Insert(rowBeforePosition + 1, computedPositionOfRow2 - position); } editTransaction.Update(); grid.ViewModel.DefaultView.UpdateLayout(); if (flag) { List <int> heightStarIndices = this.GetHeightStarIndices(grid); this.NormalizeHeightStars(grid, heightStarIndices); } else { grid.RowDefinitions[rowBeforePosition].Height = new GridLength(grid.ComputedRowHeightCache[rowBeforePosition]); grid.RowDefinitions[rowBeforePosition].ClearValue(RowDefinitionNode.MinHeightProperty); grid.RowDefinitions[rowBeforePosition + 1].Height = new GridLength(grid.ComputedRowHeightCache[rowBeforePosition + 1]); grid.RowDefinitions[rowBeforePosition + 1].ClearValue(RowDefinitionNode.MinHeightProperty); } editTransaction.Update(); grid.ViewModel.RefreshSelection(); this.SetCurrentRects((BaseFrameworkElement)grid, currentRects); grid.UncacheComputedRowHeights(); editTransaction.Commit(); } } grid.ViewModel.DefaultView.AdornerLayer.InvalidateAdornersStructure((SceneElement)grid); }