123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- using System;
- using System.Linq;
- using System.Windows;
- using System.Windows.Controls;
- using HandyControl.Data;
- using HandyControl.Tools;
- using HandyControl.Tools.Extension;
- namespace HandyControl.Controls;
- public class Row : Panel
- {
- private ColLayoutStatus _layoutStatus;
- private double _maxChildDesiredHeight;
- private double _fixedWidth;
- public static readonly DependencyProperty GutterProperty = DependencyProperty.Register(
- nameof(Gutter), typeof(double), typeof(Row), new FrameworkPropertyMetadata(
- ValueBoxes.Double0Box, FrameworkPropertyMetadataOptions.AffectsMeasure, null, OnGutterCoerce),
- ValidateHelper.IsInRangeOfPosDoubleIncludeZero);
- private static object OnGutterCoerce(DependencyObject d, object basevalue) =>
- ValidateHelper.IsInRangeOfPosDoubleIncludeZero(basevalue) ? basevalue : .0;
- public double Gutter
- {
- get => (double) GetValue(GutterProperty);
- set => SetValue(GutterProperty, value);
- }
- protected override Size MeasureOverride(Size constraint)
- {
- var gutter = Gutter;
- var totalCellCount = 0;
- var totalRowCount = 1;
- _fixedWidth = 0;
- _maxChildDesiredHeight = 0;
- var cols = InternalChildren.OfType<Col>().ToList();
- foreach (var child in cols)
- {
- var cellCount = child.GetLayoutCellCount(_layoutStatus);
- if (cellCount == 0 || child.IsFixed)
- {
- child.Measure(constraint);
- _maxChildDesiredHeight = Math.Max(_maxChildDesiredHeight, child.DesiredSize.Height);
- _fixedWidth += child.DesiredSize.Width + gutter;
- }
- }
- var itemWidth = (constraint.Width - _fixedWidth + gutter) / ColLayout.ColMaxCellCount;
- itemWidth = Math.Max(0, itemWidth);
- foreach (var child in cols)
- {
- var cellCount = child.GetLayoutCellCount(_layoutStatus);
- if (cellCount > 0 && !child.IsFixed)
- {
- totalCellCount += cellCount;
- child.Measure(new Size(cellCount * itemWidth - gutter, constraint.Height));
- _maxChildDesiredHeight = Math.Max(_maxChildDesiredHeight, child.DesiredSize.Height);
- if (totalCellCount > ColLayout.ColMaxCellCount)
- {
- totalCellCount = cellCount;
- totalRowCount++;
- }
- }
- }
- return new Size(0, _maxChildDesiredHeight * totalRowCount);
- }
- protected override Size ArrangeOverride(Size finalSize)
- {
- var gutter = Gutter;
- var totalCellCount = 0;
- var cols = InternalChildren.OfType<Col>().ToList();
- var itemWidth = (finalSize.Width - _fixedWidth + gutter) / ColLayout.ColMaxCellCount;
- itemWidth = Math.Max(0, itemWidth);
- var childBounds = new Rect(0, 0, 0, _maxChildDesiredHeight);
- _layoutStatus = ColLayout.GetLayoutStatus(finalSize.Width);
- foreach (var child in cols)
- {
- if (!child.IsVisible)
- {
- continue;
- }
- var cellCount = child.GetLayoutCellCount(_layoutStatus);
- totalCellCount += cellCount;
- var childWidth = (cellCount > 0 && !child.IsFixed) ? cellCount * itemWidth - gutter : child.DesiredSize.Width;
- childBounds.Width = childWidth;
- childBounds.X += child.Offset * itemWidth;
- if (totalCellCount > ColLayout.ColMaxCellCount)
- {
- childBounds.X = 0;
- childBounds.Y += _maxChildDesiredHeight;
- totalCellCount = cellCount;
- }
- child.Arrange(childBounds);
- childBounds.X += childWidth + gutter;
- }
- return finalSize;
- }
- }
|