/// <summary> /// Finds an empty spot on the grid to place new grid item. /// </summary> /// <param name="defaultColSpan">Column span of new item</param> /// <param name="defaultRowSpan">Row span of new item</param> private void autoAddGridItem(UIElement content, int defaultColSpan, int defaultRowSpan) { int column, row, columnSpan, rowSpan; if (AutoAssignGridSpace) { column = 0; row = 0; columnSpan = defaultColSpan; rowSpan = defaultRowSpan; } else { column = Grid.GetColumn(content); row = Grid.GetRow(content); columnSpan = Grid.GetColumnSpan(content); rowSpan = Grid.GetRowSpan(content); } // Ensures the column span does not exceed the number of columns if (columnSpan > parentGrid.ColumnDefinitions.Count) { columnSpan = parentGrid.ColumnDefinitions.Count; } var j = row; while (true) { for (var i = 0; i < parentGrid.ColumnDefinitions.Count; i++) { if (j == row && i < column) { i = column; } var element = new ElementGridSpace(i, j, columnSpan, rowSpan); if (findOverlayingElements(element).Any()) { continue; } if (element.rightColumn >= parentGrid.ColumnDefinitions.Count) { continue; } addGridItem(content, i, j, columnSpan, rowSpan); return; } j++; } }
/// <summary> /// Finds any elements that overlay this UI element /// </summary> /// <param name="element">Element that has (or doesn't have) overlaid elements</param> /// <param name="excludeElements">Elements to ignore even if they're overlaid with this element</param> /// <returns>List of element grid spaces that overlay the input "element" parameter</returns> private IList <ElementGridSpace> findOverlayingElements(UIElement element, params UIElement[] excludeElements) { var elementGridSpace = new ElementGridSpace(element); return(getPanelGridSpaces() .Where(x => x.element != element) .Where(x => !excludeElements.Contains(x.element)) .Where(x => elementGridSpace.intersects(x)) .ToList()); }
public void moveOverlaidElementsDown(UIElement overlayElementInput, int newRow, params UIElement[] dontMoveElements) { // Sets the new row of the overlayElementInput Grid.SetRow(overlayElementInput, newRow); var inputOverlayBottomRow = new ElementGridSpace(overlayElementInput).bottomRow; // Recursively moves down any elements that overlayElementInput overlays. foreach (var overlayingElement in findOverlayingElements(overlayElementInput, dontMoveElements)) { // Calculates new row of overlaid element var overlayElementNewRow = inputOverlayBottomRow + 1; moveOverlaidElementsDown(overlayingElement.element, overlayElementNewRow); } }
public void moveTraceBorderOverlaidElements(UIElement originalElement) { var traceBorderOverlayElements = findOverlayingElements(traceBorder, originalElement); if (!traceBorderOverlayElements.Any()) { return; } // Calculates new row of overlaid element var newRow = new ElementGridSpace(traceBorder).bottomRow + 1; foreach (var overlayingElement in traceBorderOverlayElements) { moveOverlaidElementsDown(overlayingElement.element, newRow, originalElement); } }
/// <summary> /// Finds overlaying element of an element grid space. /// </summary> /// <param name="inputGridSpace">Element grid space to compare.</param> /// <returns></returns> private IList <ElementGridSpace> findOverlayingElements(ElementGridSpace inputGridSpace) { return(getPanelGridSpaces() .Where(inputGridSpace.intersects) .ToList()); }