예제 #1
0
        /// <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++;
            }
        }
예제 #2
0
        /// <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());
        }
예제 #3
0
        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);
            }
        }
예제 #4
0
        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);
            }
        }
예제 #5
0
 /// <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());
 }