首页 > 其他分享 >WPF开发一个可以自适应排列的Panel控件

WPF开发一个可以自适应排列的Panel控件

时间:2024-04-07 10:14:58浏览次数:27  
标签:控件 排列 item 宽度 WPF WrapPanel Rect Panel

一.控件介绍

    初看标题可能无法理解,我们看看什么是自适应排列。

乍一看它有点像WrapPanel控件,都是从左至右排列,如果一行排列不下就换行继续排列,但是细看你就会发现不对,WrapPanel控件行尾是不会对齐的,也就是说只要WrapPanel的子控件的宽度不一致,每一行的末尾就会必定留下一段空白,而这个控件每一行末尾都是对齐的,这就让人很疑惑了,既然每个子控件的宽度不一样,怎么可能每一行的子控件宽度都正好?

二.实现思路

    首先我们要解决子控件高度问题,不同于WrapPanel控件取一个最高的子控件高度作为行高度,这里我们每一行子控件的高度都是一样的,如果直接测量子控件的尺寸,我们会得到一堆高低不同的子控件,所以在测量控件的时候我们需要给它一个统一的高度,这样就会得到一个高度一致,宽度各不同的子控件。

    其次我们使用测量出的尺寸从左至右排列,如果当前子控件排列的位置超出了Panel控件的最大宽度就换行继续排列,此时的排列方式与WrapPanel控件几乎一致。最关键的点来了,我们需要计算出每一行的子控件的测量出的总宽度,然后与Panel控件的总宽度做计算,得出最终的行高度,然后再做第二次测量,得出最终的子控件高度与宽度。

    最后我们通过测量出的子控件的宽度、高度、坐标等信息,在Panel控件中正常排列即可达到最终效果。

三.关键代码

3.1 第一次测量子控件尺寸

child.Measure(new Size(double.PositiveInfinity, ChildMinHeight));

3.2 第二次测量子控件尺寸

var rowWidth = row.CellList.Sum(item => item.Rect.Width);
 double width, height = child.DesiredSize.Height;

 var zoomRatio = availableSize.Width / rowWidth;
 var itemX = 0d;
 foreach (var item in row.CellList)
 {
     width = item.Rect.Width * zoomRatio;
     height = item.Rect.Height * zoomRatio;

     item.Rect = new Rect(itemX, item.Rect.Y, width, height);
     item.Element.Measure(item.Rect.Size);
     itemX += width;
 }

四.运行效果

4.1 正常效果

4.2 添加动画以后的效果

 

标签:控件,排列,item,宽度,WPF,WrapPanel,Rect,Panel
From: https://www.cnblogs.com/qushi2020/p/18118471

相关文章

  • Wpf BackgroundWorker WorkerSupportsCancellation CancellationPending
    //xaml<Windowx:Class="WpfApp37.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.mic......
  • Wpf BackgroundWorker DoWork RunWorkerCompleted
    //xaml<Windowx:Class="WpfApp37.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.mic......
  • WPF登录界面样例
    XAML文件内容如下1<Windowx:Class="ERP.Views.Login"2xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"3xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"4xmlns:d="......
  • 在RichTextBox mvvm中使用wpf工具包在插入符号处插入文本
    ,可以通过以下步骤实现:首先,确保你已经在项目中引用了WPF工具包。可以通过在VisualStudio中的项目引用中添加对WPF工具包的引用来完成。在你的MVVM模式中,创建一个名为"InsertTextCommand"的命令类,用于处理插入文本的逻辑。这个命令类应该实现ICommand接口,并且包含一个Execute方......
  • AndroidStudio学习记录(3):操纵按钮控件Botton、ImageBotton
    按钮控件是平时看到的,常用Botton和ImageButton控件,一般操纵按钮来实现相应的命令,比如在手机上的查找登录注册,以及点击命令等等。ImaBotton与Button的区别在于它没有文本,只有图片,需要制定图片路径在activity_main.xml文件中,它们是这样使用的:<?xmlversion="1.0"encoding=......
  • Debian安装1panel管理面板教程-最新
    1Panel是一个现代化、开源的Linux服务器运维管理面板。1Panel面板是一个强大的服务器管理工具,它通过提供一站式管理、易于使用的界面、高度的可定制性、安全可靠的性能、强大的扩展性以及活跃的社区支持,为用户提供了一个高效、便捷的管理解决方案。无论你是专业的系统管理......
  • 强制设置和恢复依赖属性值(类似WPF内置的Style.Trigger和Template.Trigger)
    WPF元素的依赖属性的值由众多规则决定,最高优先级的规则决定依赖属性的最终当前值。如本地值>继承值>默认值。可以临时忽略一切规则,强制为依赖属性指定一个值,相当于强行插入一个最高优先级规则,后续可以删除此强制值(最高优先级规则),将依赖属性的值恢复成原来的计算规则。这个......
  • 【Qt】:常用控件(五:显示类控件)
    常用控件一.ProgressBar二.CalendarWidget一.ProgressBar使⽤QProgressBar表⽰⼀个进度条代码⽰例:设置进度条按时间增⻓设置定时器,每个0.1秒,让进度条+1在实际开发中,进度条的取值,往往是根据当前任务的实际进度来进行设置的。比如需要读取一个很大的文......
  • 【Qt】:常用控件(四:显示类控件)
    常用控件一.Lable二.LCDNumber一.LableQLabel可以⽤来显⽰⽂本和图⽚.代码⽰例:显⽰不同格式的⽂本代码⽰例:显⽰图⽚此时,如果拖动窗⼝⼤⼩,可以看到图⽚并不会随着窗⼝⼤⼩的改变⽽同步变化为了解决这个问题,可以在Widget中重写resizeEvent函数。......
  • WPF实现树形下拉列表框(TreeComboBox)
    前言树形下拉菜单是许多WPF应用程序中常见的用户界面元素,它能够以分层的方式展示数据,提供更好的用户体验。本文将深入探讨如何基于WPF创建一个可定制的树形下拉菜单控件,涵盖从原理到实际实现的关键步骤。一、需求分析    树形下拉菜单控件的核心是将ComboBox与TreeVi......