/// <summary> /// Arranges the content of the <see cref="T:Avalonia.Controls.Primitives.DataGridColumnHeadersPresenter" />. /// </summary> /// <returns> /// The actual size used by the <see cref="T:Avalonia.Controls.Primitives.DataGridColumnHeadersPresenter" />. /// </returns> /// <param name="finalSize"> /// The final area within the parent that this element should use to arrange itself and its children. /// </param> protected override Size ArrangeOverride(Size finalSize) { if (OwningGrid == null) { return(base.ArrangeOverride(finalSize)); } if (OwningGrid.AutoSizingColumns) { // When we initially load an auto-column, we have to wait for all the rows to be measured // before we know its final desired size. We need to trigger a new round of measures now // that the final sizes have been calculated. OwningGrid.AutoSizingColumns = false; return(base.ArrangeOverride(finalSize)); } double dragIndicatorLeftEdge = 0; double frozenLeftEdge = 0; double scrollingLeftEdge = -OwningGrid.HorizontalOffset; foreach (DataGridColumn dataGridColumn in OwningGrid.ColumnsInternal.GetVisibleColumns()) { DataGridColumnHeader columnHeader = dataGridColumn.HeaderCell; Debug.Assert(columnHeader.OwningColumn == dataGridColumn); if (dataGridColumn.IsFrozen) { columnHeader.Arrange(new Rect(frozenLeftEdge, 0, dataGridColumn.LayoutRoundedWidth, finalSize.Height)); columnHeader.Clip = null; // The layout system could have clipped this becaues it's not aware of our render transform if (DragColumn == dataGridColumn && DragIndicator != null) { dragIndicatorLeftEdge = frozenLeftEdge + DragIndicatorOffset; } frozenLeftEdge += dataGridColumn.ActualWidth; } else { columnHeader.Arrange(new Rect(scrollingLeftEdge, 0, dataGridColumn.LayoutRoundedWidth, finalSize.Height)); EnsureColumnHeaderClip(columnHeader, dataGridColumn.ActualWidth, finalSize.Height, frozenLeftEdge, scrollingLeftEdge); if (DragColumn == dataGridColumn && DragIndicator != null) { dragIndicatorLeftEdge = scrollingLeftEdge + DragIndicatorOffset; } } scrollingLeftEdge += dataGridColumn.ActualWidth; } if (DragColumn != null) { if (DragIndicator != null) { EnsureColumnReorderingClip(DragIndicator, finalSize.Height, frozenLeftEdge, dragIndicatorLeftEdge); var height = DragIndicator.Bounds.Height; if (height <= 0) { height = DragIndicator.DesiredSize.Height; } DragIndicator.Arrange(new Rect(dragIndicatorLeftEdge, 0, DragIndicator.Bounds.Width, height)); } if (DropLocationIndicator != null) { if (DropLocationIndicator is Control element) { EnsureColumnReorderingClip(element, finalSize.Height, frozenLeftEdge, DropLocationIndicatorOffset); } DropLocationIndicator.Arrange(new Rect(DropLocationIndicatorOffset, 0, DropLocationIndicator.Bounds.Width, DropLocationIndicator.Bounds.Height)); } } // Arrange filler OwningGrid.OnFillerColumnWidthNeeded(finalSize.Width); DataGridFillerColumn fillerColumn = OwningGrid.ColumnsInternal.FillerColumn; if (fillerColumn.FillerWidth > 0) { fillerColumn.HeaderCell.IsVisible = true; fillerColumn.HeaderCell.Arrange(new Rect(scrollingLeftEdge, 0, fillerColumn.FillerWidth, finalSize.Height)); } else { fillerColumn.HeaderCell.IsVisible = false; } // This needs to be updated after the filler column is configured DataGridColumn lastVisibleColumn = OwningGrid.ColumnsInternal.LastVisibleColumn; if (lastVisibleColumn != null) { lastVisibleColumn.HeaderCell.UpdateSeparatorVisibility(lastVisibleColumn); } return(finalSize); }