[UWP] 自定义一个ItemsPanel
在做游民星空的搜索页面的时候,需要展示搜索热点词,返回的是一个string数组的形式,然后以一种错落的方式显示,每一个Item的大小都和热点词长度一致,然后一行放不下之后就换行,描述的不太直观,直接看图好了。

当我有这个布局需求的时候我首先就想到了看过的一篇ms-uap的博客-通过Measure & Arrange实现UWP瀑布流布局 ,自定义ItemsPanel可以满足我的需求
首先新建一个类继承Panel,然后重写Panel里的两个方法MeasureOverride 和 ArrangeOverride
贴出MSDN的原版解释
MeasureOverride(Size availableSize)
When overridden in a derived class, measures the size in layout required for child elements and determines a size for the FrameworkElement derived class.
ArrangeOverride (Size finalSize)
When overridden in a derived class, positions child elements and determines a size for a FrameworkElement derived class.
我的理解是MeasureOverride 是计算布局中所有的子控件需要的大小之和并返回这个值,availableSize参数是父控件提供的可用大小,关键是计算
而ArrangeOverride对子元素进行布局操作并决定布局需要的大小,主要是布局。实际上运行的时候也是先执行MeasureOverride方法然后执行ArrangeOverride方法。
在MeasureOverride中可以获取每个子控件的大小(宽度和高度),通过传过来的availableSize得到父控件的可用大小,然后就是简单的数学了,Panel给我的感觉像是一张有坐标系的图纸,通过坐标在上面布局子控件
这里的布局逻辑是,将子控件横向排列,并记下当前已布局的子控件的宽度和,直到有下一个子控件的宽度+已布局子控件的宽度和>父控件的宽度时,换行,也就是把Y坐标+=控件的高度(这里控件的高度都是一致的)
protected override Size MeasureOverride(Size availableSize)
{
//可用空间大小
Size usefulSize = new Size(availableSize.Width, double.PositiveInfinity); //控件高度
double y = ;
double x = ; foreach (UIElement item in Children)
{
item.Measure(usefulSize); Size itemSize = item.DesiredSize;
double itemWidth = itemSize.Width; y = (itemSize.Height) > y ? itemSize.Height : y; //加入该子控件后一行满了
if (x + itemSize.Width > availableSize.Width)
{
x = ;
y += itemSize.Height;
}
x += itemSize.Width;
} return new Size(availableSize.Width, y);
} /// <summary>
/// 为每个子控件布局
/// </summary>
/// <param name="finalSize"></param>
/// <returns></returns>
protected override Size ArrangeOverride(Size finalSize)
{
//记录横坐标
double x = 0.0;
double y = 0.0; foreach (UIElement item in Children)
{
Size itemSize = item.DesiredSize;
double itemWidth = itemSize.Width; //加入该控件后一行满了
if (x + itemSize.Width > finalSize.Width)
{
x = ;
y += itemSize.Height;
}
//控件的坐标
Point pt = new Point(x, y); //控件布局
item.Arrange(new Rect(pt, itemSize));
x += itemSize.Width;
} return finalSize;
}
[UWP] 自定义一个ItemsPanel的更多相关文章
- UWP自定义RadioButton实现Tab底部导航
先看效果: 参照Android的实现方式用RadioButton来实现,但是Uwp的RadioButton并没有安卓的Selector选择器 下面是一个比较简单的实现,如果有同学有更好的实现,欢迎留言 ...
- [uwp]自定义图形裁切控件
开始之前,先上一张美图.图中的花叫什么,我已经忘了,或者说从来就不知道,总之谓之曰“野花”.只记得花很美,很香,春夏时节,漫山遍野全是她.这大概是七八年前的记忆了,不过她依旧会很准时的在山上沐浴春光, ...
- uwp - 做一个相对炫酷的动画按钮/按钮动画
原文:uwp - 做一个相对炫酷的动画按钮/按钮动画 看腻了系统自带的button animation何不尝试下自定义一个较为炫酷的动画顺便提升用户体验.效果图: 动画分为几个部分,分别是:内圆从中心 ...
- UWP 自定义RadioButton实现Tab底部导航
先看效果: 参照Android的实现方式用RadioButton来实现,但是Uwp的RadioButton并没有安卓的Selector选择器 下面是一个比较简单的实现,如果有同学有更好的实现,欢迎留言 ...
- SpringMVC 自定义一个拦截器
自定义一个拦截器方法,实现HandlerInterceptor方法 public class FirstInterceptor implements HandlerInterceptor{ /** * ...
- jQuery Validate 表单验证插件----自定义一个验证方法
一.下载依赖包 网盘下载:https://yunpan.cn/cryvgGGAQ3DSW 访问密码 f224 二.引入依赖包 <script src="../../scripts/j ...
- Spring自定义一个拦截器类SomeInterceptor,实现HandlerInterceptor接口及其方法的实例
利用Spring的拦截器可以在处理器Controller方法执行前和后增加逻辑代码,了解拦截器中preHandle.postHandle和afterCompletion方法执行时机. 自定义一个拦截器 ...
- JSTL,自定义一个标签的功能案例
1.自定义一个带有两个属性的标签<max>,用于计算并输出两个数的最大值: 2.自定义一个带有一个属性的标签<lxn:readFile src=“”>,用于输出指定文件的内容 ...
- 自定义View(7)官方教程:自定义View(含onMeasure),自定义一个Layout(混合组件),重写一个现有组件
Custom Components In this document The Basic Approach Fully Customized Components Compound Controls ...
随机推荐
- BZOJ2038 小Z的袜子 莫队
BZOJ2038 题意:q(5000)次询问,问在区间中随意取两个值,这两个值恰好相同的概率是多少?分数表示: 感觉自己复述的题意极度抽象,还是原题意有趣(逃: 思路:设在L到R这个区间中,x这个值得 ...
- hdu 5969 最大的位或(贪心)
Problem Description B君和G君聊天的时候想到了如下的问题.给定自然数l和r ,选取2个整数x,y满足l <= x <= y <= r ,使得x|y最大.其中|表示 ...
- 基于Python的多线程与多进程
1.I/O密集型与计算密集型 多进程适用于I/O密集型 多进程适用于计算密集型 2.没有sleep(T)的多个死循环只能用多进程 3.模块介绍: 1)threading模块(_thread模块已淘汰) ...
- Airflow:TypeError an integer is required (got type NoneType) 一次诡异问题排查
当使用rabbitmq作为airflow的broker的时候,启动scheduler,即执行airflow scheduler命令的时候抛出以下异常: Traceback (most recent ...
- Python获取列表中的最后一个或者倒数第几个的方案
print(members[3]) 灵魂所在“ - (负号 )” 我们先来创建一个列表,和php中的数组一样. members = ['张三','李四','王五','芳芳','小明','小王'] 按照 ...
- 各种浏览器UA值
UA User-Agent:用户代理,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本.CPU 类型.浏览器及版本.浏览器引擎.浏览器语言.浏览器插件等. 标准格式为: 浏览器标识 ...
- RDDs之combineByKey()
combineByKey(crateCombiner,mergeValue,mergeCombiners,partitioner) 最常用的基于Key的聚合函数,返回的类型可以和输入的类型不一样 许多 ...
- Java网络方面
最近在面试 有些概念懂 但是需要梳理一下 借着面试看看自己会多少. 1.网络编程的同步 异步 阻塞 非阻塞? 同步:函数调用在没有得到结果之前,不返回任何结果: 异步:函数调用在没有得到结果之前,不返 ...
- 用 CocosCreator 快速开发推箱子游戏
游戏总共分为4个功能模块: - 开始游戏(menuLayer) - 关卡选择(levelLayer) - 游戏(gameLayer) - 游戏结算(gameOverLayer) Creator内组件效 ...
- 基于windows的Redis后台服务安装卸载管理
首先,需要你进入你的Redis解压根目录,例如,类似于我下图的这样子: 接着打开你的cmd,使用cd命令切换到该目录,或者直接在上图的地址栏输入“cmd”并回车.这里为什么让你先使用资源管理器找到你的 ...