WPF开辟一个可以自顺应排列的Panel控件

打印 上一主题 下一主题

主题 865|帖子 865|积分 2595

一.控件先容
    初看标题可能无法明确,我们看看什么是自顺应排列。

乍一看它有点像WrapPanel控件,都是从左至右排列,如果一行排列不下就换行继续排列,但是细看你就会发现不对,WrapPanel控件行尾是不会对齐的,也就是说只要WrapPanel的子控件的宽度不一致,每一行的末端就会必定留下一段空白,而这个控件每一行末端都是对齐的,这就让人很疑惑了,既然每个子控件的宽度不一样,怎么可能每一行的子控件宽度都正好?
二.实现思路
    首先我们要解决子控件高度问题,不同于WrapPanel控件取一个最高的子控件高度作为行高度,这里我们每一行子控件的高度都是一样的,如果直接测量子控件的尺寸,我们会得到一堆高低不同的子控件,以是在测量控件的时候我们必要给它一个统一的高度,如许就会得到一个高度一致,宽度各不同的子控件。
    其次我们使用测量出的尺寸从左至右排列,如果当前子控件排列的位置超出了Panel控件的最大宽度就换行继续排列,此时的排列方式与WrapPanel控件几乎一致。最关键的点来了,我们必要计算出每一行的子控件的测量出的总宽度,然后与Panel控件的总宽度做计算,得出最终的行高度,然后再做第二次测量,得出最终的子控件高度与宽度。
    最后我们通过测量出的子控件的宽度、高度、坐标等信息,在Panel控件中正常排列即可达到最终效果。
三.关键代码
3.1 第一次测量子控件尺寸
  1. child.Measure(new Size(double.PositiveInfinity, ChildMinHeight));
复制代码
3.2 第二次测量子控件尺寸
  1. var rowWidth = row.CellList.Sum(item => item.Rect.Width);
  2. double width, height = child.DesiredSize.Height;
  3. var zoomRatio = availableSize.Width / rowWidth;
  4. var itemX = 0d;
  5. foreach (var item in row.CellList)
  6. {
  7.      width = item.Rect.Width * zoomRatio;
  8.      height = item.Rect.Height * zoomRatio;
  9.      item.Rect = new Rect(itemX, item.Rect.Y, width, height);
  10.      item.Element.Measure(item.Rect.Size);
  11.      itemX += width;
  12. }
复制代码
四.运行效果
4.1 正常效果

4.2 添加动画以后的效果

 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用户国营

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表