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 AddVerticalGridline(GridElement grid, double position) { using (SceneEditTransaction editTransaction = grid.ViewModel.CreateEditTransaction(StringTable.UndoUnitAddGridline)) { using (grid.ViewModel.ForceBaseValue()) { List <LayoutCacheRecord> currentRects = this.GetCurrentRects((BaseFrameworkElement)grid); int columnBeforePosition = grid.GetComputedColumnBeforePosition(position); double positionOfColumn1 = grid.GetComputedPositionOfColumn(columnBeforePosition); double positionOfColumn2 = grid.GetComputedPositionOfColumn(columnBeforePosition + 1); bool flag = grid.ColumnDefinitions.Count == 0 || grid.ColumnDefinitions[columnBeforePosition].Width.IsStar; grid.CacheComputedColumnWidths(); this.EnsureOneColumn(grid); grid.ColumnDefinitions.Insert(columnBeforePosition + 1, ColumnDefinitionNode.Factory.Instantiate(grid.ViewModel)); position = Math.Max(position, positionOfColumn1); if (position > positionOfColumn2) { grid.ComputedColumnWidthCache[columnBeforePosition] = positionOfColumn2 - positionOfColumn1; grid.ComputedColumnWidthCache.Insert(columnBeforePosition + 1, position - positionOfColumn2); } else { grid.ComputedColumnWidthCache[columnBeforePosition] = position - positionOfColumn1; grid.ComputedColumnWidthCache.Insert(columnBeforePosition + 1, positionOfColumn2 - position); } editTransaction.Update(); grid.ViewModel.DefaultView.UpdateLayout(); if (flag) { List <int> widthStarIndices = this.GetWidthStarIndices(grid); this.NormalizeWidthStars(grid, widthStarIndices); } else { grid.ColumnDefinitions[columnBeforePosition].Width = new GridLength(grid.ComputedColumnWidthCache[columnBeforePosition]); grid.ColumnDefinitions[columnBeforePosition].ClearValue(ColumnDefinitionNode.MinWidthProperty); grid.ColumnDefinitions[columnBeforePosition + 1].Width = new GridLength(grid.ComputedColumnWidthCache[columnBeforePosition + 1]); grid.ColumnDefinitions[columnBeforePosition + 1].ClearValue(ColumnDefinitionNode.MinWidthProperty); } editTransaction.Update(); grid.ViewModel.RefreshSelection(); this.SetCurrentRects((BaseFrameworkElement)grid, currentRects); grid.UncacheComputedColumnWidths(); editTransaction.Commit(); } } grid.ViewModel.DefaultView.AdornerLayer.InvalidateAdornersStructure((SceneElement)grid); }