/// <summary> /// ArrangeOverride /// </summary> /// <param name="finalSize">The final area within the parent that this object should use to arrange itself and its children.</param> /// <returns>The actual size that is used after the element is arranged in layout.</returns> protected override Size ArrangeOverride(Size finalSize) { if (this.OwningGrid == null) { return(base.ArrangeOverride(finalSize)); } Size size = base.ArrangeOverride(finalSize); if (_rootElement != null) { if (this.OwningGrid.AreRowGroupHeadersFrozen) { foreach (UIElement child in _rootElement.Children) { child.Clip = null; } } else { double frozenLeftEdge = 0; foreach (UIElement child in _rootElement.Children) { if (DataGridFrozenGrid.GetIsFrozen(child) && child.Visibility == Visibility.Visible) { TranslateTransform transform = new TranslateTransform(); // Automatic layout rounding doesn't apply to transforms so we need to Round this transform.X = Math.Round(this.OwningGrid.HorizontalOffset); child.RenderTransform = transform; double childLeftEdge = child.Translate(this, new Point(child.RenderSize.Width, 0)).X - transform.X; frozenLeftEdge = Math.Max(frozenLeftEdge, childLeftEdge + this.OwningGrid.HorizontalOffset); } } // Clip the non-frozen elements so they don't overlap the frozen ones foreach (UIElement child in _rootElement.Children) { if (!DataGridFrozenGrid.GetIsFrozen(child)) { EnsureChildClip(child, frozenLeftEdge); } } } } return(size); }
/// <summary> /// Arranges the content of the <see cref="T:Avalonia.Controls.DataGridRow" />. /// </summary> /// <returns> /// The actual size used by the <see cref="T:Avalonia.Controls.DataGridRow" />. /// </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 the DataGrid was scrolled horizontally after our last Arrange, we need to make sure // the Cells and Details are Arranged again if (_lastHorizontalOffset != OwningGrid.HorizontalOffset) { _lastHorizontalOffset = OwningGrid.HorizontalOffset; InvalidateHorizontalArrange(); } Size size = base.ArrangeOverride(finalSize); if (_checkDetailsContentHeight) { _checkDetailsContentHeight = false; EnsureDetailsContentHeight(); } if (RootElement != null) { foreach (Control child in RootElement.Children) { if (DataGridFrozenGrid.GetIsFrozen(child)) { TranslateTransform transform = new TranslateTransform(); // Automatic layout rounding doesn't apply to transforms so we need to Round this transform.X = Math.Round(OwningGrid.HorizontalOffset); child.RenderTransform = transform; } } } if (_bottomGridLine != null) { RectangleGeometry gridlineClipGeometry = new RectangleGeometry(); gridlineClipGeometry.Rect = new Rect(OwningGrid.HorizontalOffset, 0, Math.Max(0, DesiredSize.Width - OwningGrid.HorizontalOffset), _bottomGridLine.DesiredSize.Height); _bottomGridLine.Clip = gridlineClipGeometry; } return(size); }