C# Wpf重载Wrap排版自动换行(ArrangeOverride)

本文介绍了一种使用Xmal界面和C#逻辑相结合的方法,优化选择题答案的排版效果。通过动态调整控件宽度,实现不同数量选项的合理布局,提升用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Xmal界面:

<ItemsControl.ItemsPanel>
     <ItemsPanelTemplate >
        <questionInfo:selPanel  Orientation="Horizontal" />
    </ItemsPanelTemplate>
</ItemsControl.ItemsPanel>

后台CS逻辑:

public class selPanel : WrapPanel
    {
        private double initW = 0;//初始宽度
        protected override Size ArrangeOverride(Size arrangeBounds)
        {
            Console.WriteLine("w:" + arrangeBounds.Width + " H:" + arrangeBounds.Height);
            Console.WriteLine("控件宽度:" + this.Width);

            if (initW > 0 && Math.Abs(initW - arrangeBounds.Width) < 30) return base.ArrangeOverride(arrangeBounds);//宽度变化明显重新计算
            initW = arrangeBounds.Width;
            double halfW = arrangeBounds.Width / 2;
            bool halfflag = true, fourflag = true;
            Size teSize = new Size(halfW, arrangeBounds.Height);//一半宽
            Size fSize = new Size(halfW / 2, arrangeBounds.Height);//1/4宽
            double minh = 0, maxh = 0;
            foreach (UIElement element in base.InternalChildren)
            {
                element.Measure(fSize);
                Size fourSize = element.DesiredSize;//宽度1/4时需要的高度

                element.Measure(teSize);
                Size halfSize = element.DesiredSize;//宽度一半时需要的高度

                element.Measure(arrangeBounds);
                Size acSize = element.DesiredSize;//完整大小时需要的高度


                minh = minh > 5 ? Math.Min(minh, acSize.Height) : acSize.Height;//5是随意给的
                maxh = Math.Max(maxh, acSize.Height);

                if (fourSize.Height > acSize.Height + 1)//+1给点冗余
                {
                    fourflag = false;
                }
                if (halfSize.Height > acSize.Height + 1)
                {
                    halfflag = false;
                }
            }
            if (maxh - minh < 15)//高度差太大,不美观,不在一行显示
            {
                if (fourflag)//可以显示四项
                {
                    this.ItemWidth = halfW / 2;
                    return new Size(0, 0);//增加性能 后面就不用算了
                }
                if (halfflag)//可以显示两项
                {
                    this.ItemWidth = halfW;
                    return new Size(0, 0);//增加性能 后面就不用算了
                }
            }

            return base.ArrangeOverride(arrangeBounds);
        }
    }

满足了选择题答案排版。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值