// Used to interleave specified column dimensions with automatic columns added to use // underlying Grid layout for main arrange of UniformGrid. internal void SetupColumnDefinitions(int columns) { // Mark initial definitions so we don't erase them. foreach (var cd in ColumnDefinitions) { if (GetAutoLayout(cd) == null) { SetAutoLayout(cd, false); } } // Remove non-autolayout columns we've added and then add them in the right spots. if (columns != ColumnDefinitions.Count) { for (int c = ColumnDefinitions.Count - 1; c >= 0; c--) { if (GetAutoLayout(ColumnDefinitions[c]) == true) { this.ColumnDefinitions.RemoveAt(c); } } for (int c = ColumnDefinitions.Count; c < columns; c++) { var cd = new ColumnDefinition(); SetAutoLayout(cd, true); ColumnDefinitions.Insert(c, cd); } } }
public RungUI AddColumn(int pos, double width, GridUnitType unit) { var col = new ColumnDefinition(); col.Width = new GridLength(width, unit); ColumnDefinitions.Insert(pos, col); return(this); }
public RungUI AddColumn(int pos) { var col = new ColumnDefinition(); col.Width = GridLength.Auto; ColumnDefinitions.Insert(pos, col); return(this); }
void CreateCorrectingColumn() { CorrectingColumn = new StdColumnDefinition(); Binding b = new Binding("GroupedColumns.Count"); b.Source = View; b.Converter = new GridLengthValueConverter(); b.ConverterParameter = ((TableView)View).LeftGroupAreaIndent; BindingOperations.SetBinding(CorrectingColumn, System.Windows.Controls.ColumnDefinition.WidthProperty, b); ColumnDefinitions.Insert(0, CorrectingColumn); }
private AbstractLogColumnPresenter AddColumn(ILogFileColumn column) { var columnPresenter = CreatePresenterFor(column); // The 2nd column is reserved for the data source name which hasn't been // ported to the new ILogFileColumnPresenter interface just yet int columnIndex; if (_columnPresenters.Count == 0) { columnIndex = 0; } else if (Equals(column, LogFileColumns.Message)) { columnIndex = ColumnDefinitions.IndexOf(_messageColumnDefinition); } else { columnIndex = _columnPresenters.Count + 1; } columnPresenter.SetValue(RowProperty, 0); columnPresenter.SetValue(ColumnProperty, columnIndex); _columnPresenters.Add(columnPresenter.Column, columnPresenter); var columnDefinition = new ColumnDefinition { Width = new GridLength(value: 1, type: GridUnitType.Auto) }; _columnDefinitionsByColumn.Add(columnPresenter.Column, columnDefinition); _columnsByColumnDefinition.Add(columnDefinition, columnPresenter.Column); int insertionIndex; if (_messageColumnDefinition != null) { insertionIndex = ColumnDefinitions.IndexOf(_messageColumnDefinition); } else { insertionIndex = ColumnDefinitions.Count; } ColumnDefinitions.Insert(insertionIndex, columnDefinition); return(columnPresenter); }
public void Dock(IDockContent nextTo, IDockContent newContent, DockTo dockTo) { IDockLayout targetChild = null; if (nextTo != null) { foreach (IDockLayout child in m_children) { if (child.HasChild(nextTo)) { targetChild = child; break; } } } if (targetChild == null) { foreach (IDockLayout child in m_children) { if (child.HasDescendant(nextTo)) { child.Dock(nextTo, newContent, dockTo); // child was docked, nothing else is necessary return; } } } if (dockTo == DockTo.Center && m_children.Count == 1) { m_children[0].Dock(null, newContent, dockTo); } else if (m_children.Count < 2) { if (dockTo == DockTo.Center) { dockTo = DockTo.Right; } if (dockTo == DockTo.Top || dockTo == DockTo.Bottom) { m_orientation = Orientation.Vertical; } else { m_orientation = Orientation.Horizontal; } DockedWindow newChild = new DockedWindow(Root, newContent); if (Children.Count == 0) { AddFirstChild(newChild); } else { if (targetChild == null) { if (dockTo == DockTo.Top || dockTo == DockTo.Left) { targetChild = m_children[0]; } else { targetChild = m_children[m_children.Count - 1]; } } FrameworkElement control = (FrameworkElement)targetChild; int index = m_children.IndexOf(targetChild); if (dockTo == DockTo.Left || dockTo == DockTo.Right) { GridSplitter splitter = NewGridSplitter(Orientation.Horizontal); int column = (int)control.GetValue(Grid.ColumnProperty); ColumnDefinition oldColumn = ColumnDefinitions[index * 2]; ContentSettings contentSettings = (newContent is TabLayout) ? ((TabLayout)newContent).Children[0].Settings : ((DockContent)newContent).Settings; double totalWidth = ((FrameworkElement)targetChild).ActualWidth; double width = Math.Max(Math.Min(contentSettings.Size.Width, (totalWidth - splitter.Width) / 2), (totalWidth - splitter.Width) / 5); double ratioNew = width / totalWidth; double ratioOld = (totalWidth - width - splitter.Width) / totalWidth; if (dockTo == DockTo.Left) { ColumnDefinition leftColumn = NewColumnDefinition(new GridLength(oldColumn.Width.Value * ratioNew, oldColumn.Width.GridUnitType), m_minGridSize.Width); ColumnDefinition rightColumn = NewColumnDefinition(new GridLength(oldColumn.Width.Value * ratioOld, oldColumn.Width.GridUnitType), m_minGridSize.Width); ColumnDefinitions[index * 2] = leftColumn; ColumnDefinitions.Insert(index * 2 + 1, rightColumn); ColumnDefinitions.Insert(index * 2 + 1, NewColumnDefinition(new GridLength(1, GridUnitType.Auto), 0)); m_children.Insert(index, newChild); Children.Insert(index * 2, splitter); Children.Insert(index * 2, newChild); } else { ColumnDefinition leftColumn = NewColumnDefinition(new GridLength(oldColumn.Width.Value * ratioOld, oldColumn.Width.GridUnitType), m_minGridSize.Width); ColumnDefinition rightColumn = NewColumnDefinition(new GridLength(oldColumn.Width.Value * ratioNew, oldColumn.Width.GridUnitType), m_minGridSize.Width); ColumnDefinitions[index * 2] = leftColumn; ColumnDefinitions.Insert(index * 2 + 1, rightColumn); ColumnDefinitions.Insert(index * 2 + 1, NewColumnDefinition(new GridLength(1, GridUnitType.Auto), 0)); m_children.Insert(index + 1, newChild); Children.Insert(index * 2 + 1, newChild); Children.Insert(index * 2 + 1, splitter); } for (int i = index * 2; i < Children.Count; i++) { Grid.SetColumn(Children[i], i); } } else { GridSplitter splitter = NewGridSplitter(Orientation.Vertical); int row = (int)control.GetValue(Grid.RowProperty); RowDefinition oldRow = RowDefinitions[index * 2]; ContentSettings contentSettings = (newContent is TabLayout) ? ((TabLayout)newContent).Children[0].Settings : ((DockContent)newContent).Settings; double totalHeight = ((FrameworkElement)targetChild).ActualHeight; double height = Math.Max(Math.Min(contentSettings.Size.Height, (totalHeight - splitter.Height) / 2), (totalHeight - splitter.Height) / 5); double ratioNew = height / totalHeight; double ratioOld = (totalHeight - height - splitter.Height) / totalHeight; if (dockTo == DockTo.Top) { RowDefinition topRow = NewRowDefinition(new GridLength(oldRow.Height.Value * ratioNew, oldRow.Height.GridUnitType), m_minGridSize.Height); RowDefinition bottomRow = NewRowDefinition(new GridLength(oldRow.Height.Value * ratioOld, oldRow.Height.GridUnitType), m_minGridSize.Height); RowDefinitions[index * 2] = topRow; RowDefinitions.Insert(index * 2 + 1, bottomRow); RowDefinitions.Insert(index * 2 + 1, NewRowDefinition(new GridLength(1, GridUnitType.Auto), 0)); m_children.Insert(index, newChild); Children.Insert(index * 2, splitter); Children.Insert(index * 2, newChild); } else { RowDefinition topRow = NewRowDefinition(new GridLength(oldRow.Height.Value * ratioOld, oldRow.Height.GridUnitType), m_minGridSize.Height); RowDefinition bottomRow = NewRowDefinition(new GridLength(oldRow.Height.Value * ratioNew, oldRow.Height.GridUnitType), m_minGridSize.Height); RowDefinitions[index * 2] = topRow; RowDefinitions.Insert(index * 2 + 1, bottomRow); RowDefinitions.Insert(index * 2 + 1, NewRowDefinition(new GridLength(1, GridUnitType.Auto), 0)); m_children.Insert(index + 1, newChild); Children.Insert(index * 2 + 1, newChild); Children.Insert(index * 2 + 1, splitter); } for (int i = index * 2; i < Children.Count; i++) { Grid.SetRow(Children[i], i); } } } } else if (dockTo == DockTo.Left || dockTo == DockTo.Right || dockTo == DockTo.Top || dockTo == DockTo.Bottom) { DockedWindow dockedWindow = (DockedWindow)targetChild; int index = m_children.IndexOf(targetChild); GridLayout gridLayout = new GridLayout(Root); gridLayout.SetValue(Grid.ColumnProperty, dockedWindow.GetValue(Grid.ColumnProperty)); gridLayout.SetValue(Grid.RowProperty, dockedWindow.GetValue(Grid.RowProperty)); Children.Remove(dockedWindow); IDockContent content = dockedWindow.DockedContent; dockedWindow.Undock(content); m_children[index] = gridLayout; Children.Insert(index * 2, gridLayout); gridLayout.Dock(null, content, DockTo.Center); UpdateLayout(); gridLayout.Dock(content, newContent, dockTo); } else if (targetChild != null) { targetChild.Dock(nextTo, newContent, dockTo); } }
/// <summary> /// Will merge itself with given grid. Basicly it takes child grid, removes that grid, and all /// children of removed grid will be added to this grid. The child grid must have same orientation /// or maximum of 1 child. /// </summary> /// <param name="grid">Grid to merge with</param> internal void MergeWith(GridLayout grid) { // get the index of the grid to merge with (it is child of this grid) int index = m_children.IndexOf(grid); double totalValue = 0; int indexOffset = 0; if (Orientation == Orientation.Horizontal) { // get the column definition of child grid ColumnDefinition oldColumnDef = ColumnDefinitions[index * 2]; // count the sum of columns widths of childs children foreach (IDockLayout newLayout in grid.Layouts) { FrameworkElement element = (FrameworkElement)newLayout; int columnIndex = Grid.GetColumn(element); ColumnDefinition layoutColumnDef = grid.ColumnDefinitions[columnIndex]; totalValue += layoutColumnDef.Width.Value; } // remove the child from our list, from view children adn from column definitions m_children.RemoveAt(index); Children.RemoveAt(index * 2); ColumnDefinitions.RemoveAt(index * 2); // move all childs children to this grid and create column definitions for each of them foreach (IDockLayout newLayout in grid.Layouts) { FrameworkElement element = (FrameworkElement)newLayout; int columnIndex = Grid.GetColumn(element); ColumnDefinition layoutColumnDef = grid.ColumnDefinitions[columnIndex]; double newValue = oldColumnDef.Width.Value * layoutColumnDef.Width.Value / totalValue; ColumnDefinition newColumnDef = NewColumnDefinition(new GridLength(newValue, GridUnitType.Star), m_minGridSize.Width); grid.Children.Remove(element); ColumnDefinitions.Insert((index + indexOffset) * 2, newColumnDef); Children.Insert((index + indexOffset) * 2, element); m_children.Insert(index + indexOffset, newLayout); if (indexOffset < grid.Layouts.Count - 1) { // if we move more than one child, then we need to add new splitters too GridSplitter splitter = NewGridSplitter(Orientation.Horizontal); ColumnDefinitions.Insert((index + indexOffset) * 2 + 1, NewColumnDefinition(new GridLength(1, GridUnitType.Auto), 0)); Children.Insert((index + indexOffset) * 2 + 1, splitter); } indexOffset++; } // set the association of column indexes for (int i = 0; i < Children.Count; i++) { Grid.SetColumn(Children[i], i); } } else { // get the row definition of child grid RowDefinition oldRowDef = RowDefinitions[index * 2]; // count the sum of row heights of childs children foreach (IDockLayout newLayout in grid.Layouts) { FrameworkElement element = (FrameworkElement)newLayout; int RowIndex = Grid.GetRow(element); RowDefinition layoutRowDef = grid.RowDefinitions[RowIndex]; totalValue += layoutRowDef.Height.Value; } // remove the child from our list, from view children adn from row definitions m_children.RemoveAt(index); Children.RemoveAt(index * 2); RowDefinitions.RemoveAt(index * 2); // move all childs children to this grid and create row definitions for each of them foreach (IDockLayout newLayout in grid.Layouts) { FrameworkElement element = (FrameworkElement)newLayout; int RowIndex = Grid.GetRow(element); RowDefinition layoutRowDef = grid.RowDefinitions[RowIndex]; double newValue = oldRowDef.Height.Value * layoutRowDef.Height.Value / totalValue; RowDefinition newRowDef = NewRowDefinition(new GridLength(newValue, GridUnitType.Star), m_minGridSize.Height); grid.Children.Remove(element); RowDefinitions.Insert((index + indexOffset) * 2, newRowDef); Children.Insert((index + indexOffset) * 2, element); m_children.Insert(index + indexOffset, newLayout); if (indexOffset < grid.Layouts.Count - 1) { // if we move more than one child, then we need to add new splitters too GridSplitter splitter = NewGridSplitter(Orientation.Vertical); RowDefinitions.Insert((index + indexOffset) * 2 + 1, NewRowDefinition(new GridLength(1, GridUnitType.Auto), 0)); Children.Insert((index + indexOffset) * 2 + 1, splitter); } indexOffset++; } // set the association of row indexes for (int i = 0; i < Children.Count; i++) { Grid.SetRow(Children[i], i); } } }
void LayoutChildren() { if (_childrenRearranged) { return; } _childrenRearranged = true; int currentRow = 0; int currentCol = 1; int childControls = VisualTreeHelper.GetChildrenCount(this); if (Padding.Top > 0) { var row = new RowDefinition { Height = new GridLength(Padding.Top) }; RowDefinitions.Add(row); } //redo this to add a border as the parent element??? ColumnDefinitions.Insert(0, new ColumnDefinition { Width = new GridLength(Padding.Left) }); ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(Padding.Right) }); int actualColumnCount = ColumnDefinitions.Count - 2; int columnsUsed = 0; var margin = new Thickness(); bool isFirstColumn = true; for (int idx = 0; idx < childControls; idx++) { var ctrl = VisualTreeHelper.GetChild(this, idx) as FrameworkElement; if (ctrl == null) { throw new ArgumentException("ctrl is null!!!"); } int columnProperty = GetColumn(ctrl); //this will be 0 if not set, however 1 column will still be used int columnSpanProperty = GetColumnSpan(ctrl); //this will be 1 if not set int columnsTakenByControl = (columnProperty == 0 ? 1 : columnProperty + 1) + (columnSpanProperty - 1); bool isLastColumn = ((columnsUsed + columnsTakenByControl) % actualColumnCount) == 0; if (isFirstColumn) { //ctrl.SetValue(BackgroundProperty, Brushes.Green); //first column - reset the margin. add a new row, inc the row count and reset the column to 1 margin = new Thickness(ControlPadding.Left, ControlPadding.Top, ControlPadding.Right, ControlPadding.Bottom); var row = new RowDefinition { Height = GridLength.Auto }; RowDefinitions.Add(row); currentRow++; currentCol = 1; } if (isLastColumn) { margin.Right = 0; } columnsUsed += columnsTakenByControl; isFirstColumn = (columnsUsed % actualColumnCount) == 0; //handle manually set column ctrl.Margin = margin; if (ctrl.VerticalAlignment == VerticalAlignment.Stretch) { ctrl.VerticalAlignment = VerticalAlignment.Center; } //if the Grid.Column property is set... if (columnProperty > 0) { currentCol = columnProperty + 1; } SetColumnSpan(ctrl, columnSpanProperty); SetColumn(ctrl, currentCol); SetRow(ctrl, currentRow); currentCol += columnSpanProperty; } if (Padding.Bottom > 0) { var row = new RowDefinition { Height = new GridLength(Padding.Bottom) }; RowDefinitions.Add(row); } }