垂直布局UniformGrid

UniformGrid只能水平布局,如果需要垂直布局,重写UniformGrid

public class VerticalUniformGrid : UniformGrid
    {
        private int _columns;
        private int _rows;

        protected override Size MeasureOverride(Size constraint)
        {
            UpdateComputedValues();
            Size availableSize = new(constraint.Width / _columns, constraint.Height / _rows);
            double width = 0.0;
            double height = 0.0;
            int num3 = 0;
            int count = InternalChildren.Count;
            while (num3 < count)
            {
                UIElement element = base.InternalChildren[num3];
                element.Measure(availableSize);
                Size desiredSize = element.DesiredSize;
                if (width < desiredSize.Width) width = desiredSize.Width;
                if (height < desiredSize.Height) height = desiredSize.Height;
                num3++;
            }
            return new Size(width * _columns, height * _rows);
        }

        private void UpdateComputedValues()
        {
            _columns = Columns;
            _rows = Rows;
            if (FirstColumn >= _columns) FirstColumn = 0;

            if (FirstColumn > 0)
                throw new NotImplementedException("There is no support for seting the FirstColumn (nor the FirstRow).");
            if ((_rows == 0) || (_columns == 0))
            {
                int num = 0;    // Visible children  
                int num2 = 0;
                int count = InternalChildren.Count;
                while (num2 < count)
                {
                    UIElement element = InternalChildren[num2];
                    if (element.Visibility != Visibility.Collapsed) num++;
                    num2++;
                }
                if (num == 0) num = 1;
                if (_rows == 0)
                {
                    if (_columns > 0) _rows = ((num + FirstColumn) + (_columns - 1)) / _columns;
                    else
                    {
                        _rows = (int)Math.Sqrt(num);
                        if ((_rows * _rows) < num) _rows++;
                        _columns = _rows;
                    }
                }
                else if (_columns == 0) _columns = (num + (_rows - 1)) / _rows;
            }
        }

        protected override Size ArrangeOverride(Size arrangeSize)
        {
            Rect finalRect = new(0.0, 0.0, arrangeSize.Width / _columns, arrangeSize.Height / _rows);
            double height = finalRect.Height;

            double yPos = arrangeSize.Height - height;
            finalRect.X += finalRect.Width * FirstColumn;

            finalRect.Y = 0;
            foreach (UIElement element in InternalChildren)
            {
                element.Arrange(finalRect);
                if (element.Visibility != Visibility.Collapsed)
                {
                    finalRect.Y += height;
                    if (finalRect.Y > yPos + 0.00001)//这里有个double类型精度引起的Bug,暂时先加值规避一下
                    {
                        finalRect.X += finalRect.Width;
                        finalRect.Y = 0;
                    }
                }
            }
            return arrangeSize;
        }
    }
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C#气氛组队员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值