/// <summary> /// Measures the children of a <see cref="T:Avalonia.Controls.Primitives.DataGridRowsPresenter" /> to /// prepare for arranging them during the <see cref="M:System.Windows.FrameworkElement.ArrangeOverride(System.Windows.Size)" /> pass. /// </summary> /// <param name="availableSize"> /// The available size that this element can give to child elements. Indicates an upper limit that child elements should not exceed. /// </param> /// <returns> /// The size that the <see cref="T:Avalonia.Controls.Primitives.DataGridRowsPresenter" /> determines it needs during layout, based on its calculations of child object allocated sizes. /// </returns> protected override Size MeasureOverride(Size availableSize) { if (availableSize.Height == 0 || OwningGrid == null) { return(base.MeasureOverride(availableSize)); } // If the Width of our RowsPresenter changed then we need to invalidate our rows bool invalidateRows = (!OwningGrid.RowsPresenterAvailableSize.HasValue || availableSize.Width != OwningGrid.RowsPresenterAvailableSize.Value.Width) && !double.IsInfinity(availableSize.Width); // The DataGrid uses the RowsPresenter available size in order to autogrow // and calculate the scrollbars OwningGrid.RowsPresenterAvailableSize = availableSize; OwningGrid.RowsPresenterEstimatedAvailableHeight = CalculateEstimatedAvailableHeight(availableSize); OwningGrid.OnRowsMeasure(); double totalHeight = -OwningGrid.NegVerticalOffset; double totalCellsWidth = OwningGrid.ColumnsInternal.VisibleEdgedColumnsWidth; double headerWidth = 0; foreach (Control element in OwningGrid.DisplayData.GetScrollingElements()) { DataGridRow row = element as DataGridRow; if (row != null) { if (invalidateRows) { row.InvalidateMeasure(); } } element.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); if (row != null && row.HeaderCell != null) { headerWidth = Math.Max(headerWidth, row.HeaderCell.DesiredSize.Width); } else if (element is DataGridRowGroupHeader groupHeader && groupHeader.HeaderCell != null) { headerWidth = Math.Max(headerWidth, groupHeader.HeaderCell.DesiredSize.Width); } totalHeight += element.DesiredSize.Height; } OwningGrid.RowHeadersDesiredWidth = headerWidth; // Could be positive infinity depending on the DataGrid's bounds OwningGrid.AvailableSlotElementRoom = availableSize.Height - totalHeight; totalHeight = Math.Max(0, totalHeight); return(new Size(totalCellsWidth + headerWidth, totalHeight)); }
private void GridSplitter_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { //This is necessary because the DataGrid will not refresh the hidden contents otherwise. IList <IGanttNode> nodes = (IList <IGanttNode>)TaskGrid.ItemsSource; foreach (IGanttNode node in nodes) { DataGridRow row = TaskGrid.GetDataItemRow(node); if (row != null) { row.InvalidateMeasure(); } } }
/// <summary> /// Measures the children of a <see cref="DataGridRowsPresenter"/> to /// prepare for arranging them during the <see cref="M:System.Windows.FrameworkElement.ArrangeOverride(System.Windows.Size)"/> pass. /// </summary> /// <param name="availableSize"> /// The available size that this element can give to child elements. Indicates an upper limit that child elements should not exceed. /// </param> /// <returns> /// The size that the <see cref="DataGridRowsPresenter"/> determines it needs during layout, based on its calculations of child object allocated sizes. /// </returns> protected override Size MeasureOverride(Size availableSize) { if (availableSize.Height == 0 || this.OwningGrid == null) { return(base.MeasureOverride(availableSize)); } // If the Width of our RowsPresenter changed then we need to invalidate our rows bool invalidateRows = (!this.OwningGrid.RowsPresenterAvailableSize.HasValue || availableSize.Width != this.OwningGrid.RowsPresenterAvailableSize.Value.Width) && !double.IsInfinity(availableSize.Width); // The DataGrid uses the RowsPresenter available size in order to autogrow // and calculate the scrollbars this.OwningGrid.RowsPresenterAvailableSize = availableSize; this.OwningGrid.OnRowsMeasure(); double totalHeight = -this.OwningGrid.NegVerticalOffset; double totalCellsWidth = this.OwningGrid.ColumnsInternal.VisibleEdgedColumnsWidth; double headerWidth = 0; foreach (UIElement element in this.OwningGrid.DisplayData.GetScrollingElements()) { DataGridRow row = element as DataGridRow; if (row != null) { if (invalidateRows) { row.InvalidateMeasure(); } } element.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); if (row != null && row.HeaderCell != null) { headerWidth = Math.Max(headerWidth, row.HeaderCell.DesiredSize.Width); } else { DataGridRowGroupHeader groupHeader = element as DataGridRowGroupHeader; if (groupHeader != null && groupHeader.HeaderCell != null) { headerWidth = Math.Max(headerWidth, groupHeader.HeaderCell.DesiredSize.Width); } } totalHeight += element.DesiredSize.Height; } this.OwningGrid.RowHeadersDesiredWidth = headerWidth; // Could be positive infinity depending on the DataGrid's bounds this.OwningGrid.AvailableSlotElementRoom = availableSize.Height - totalHeight; // TODO: totalHeight can be negative if we've just collapsed details. This is a workaround, // the real fix is to correct NegVerticalOffset. totalHeight = Math.Max(0, totalHeight); return(new Size(totalCellsWidth + headerWidth, totalHeight)); }