wpf ListBox,item两列不等高。

  业务有这样的需求,类似瀑布流。内容两列不等高展示。

只需要继承panel,重写MeasureOverride和ArrangeOverride方法就行了。

 很简单,内容都在代码里。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;

namespace XXXXXX
{
    public class TwoColumnPanel : Panel
    {
        /// <summary>
        /// 先测量需要多大尺寸,做个申报准备
        /// </summary>
        /// <param name="constraint">限定的尺寸,比如,规定了width和height</param>
        /// <returns></returns>
        protected override Size MeasureOverride(Size constraint)
        {
            //定义预期的宽度和高度
            double height = 0, height1 = 0, height2 = 0, width = 0;
            UIElement element;
            if (Children.Count > 0)
            { 
                element = Children[0];
                width = element.DesiredSize.Width*2;
            }
            //遍历每个元素,计算所需的总尺寸
            for (int i = 0; i < Children.Count; i++)
            {
                element = Children[i];
                //按照限定的尺寸测量一下自己,拿镜子找着自己
                element.Measure(constraint);
                if (i % 2 == 0)
                {
                    height1 += element.DesiredSize.Height;
                }
                else
                {
                    height2 += element.DesiredSize.Height;
                }
            }
            height = height1 > height2 ? height1 : height2;

            //申报,我需要这个尺寸
            return new Size(width, height);
        }

        /// <summary>
        /// 排列每个元素
        /// </summary>
        /// <param name="arrangeBounds">测量的尺寸</param>
        /// <returns></returns>
        protected override Size ArrangeOverride(Size arrangeBounds)
        {
            double currentX2 = 0,currentY1 = 0,currentY2 = 0;
            UIElement element;

            if (Children.Count > 0)
            {
                element = Children[0];
                currentX2 = element.DesiredSize.Width;
            }

            for (int i = 0; i < Children.Count; i++)
            {
                element = Children[i];
                //排列每个元素
                if (i % 2 == 0)
                {
                    Children[i].Arrange(new Rect(0, currentY1, element.DesiredSize.Width, element.DesiredSize.Height));
                    currentY1 += element.DesiredSize.Height;
                }
                else
                {
                    Children[i].Arrange(new Rect(currentX2, currentY2, element.DesiredSize.Width, element.DesiredSize.Height));
                    currentY2 += element.DesiredSize.Height;
                }
                
            }
            return arrangeBounds;
        }
    }
}

  

原文地址:https://www.cnblogs.com/m7777/p/4691533.html