编程知识 购物 网址 新闻 笑话 | 软件 日历 阅读 图书馆 China
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题 autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程 CSS/HTML/Xhtml html5 CSS XML/XSLT Dreamweaver教程 经验交流
站长资讯 .NET新手 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA VisualStudio ASP.NET-MVC .NET控件开发 EntityFramework WinRT-Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动 Html-Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP OracleERP DynamicsCRM K2 BPM 信息安全 企业信息 Android开发 iOS开发 WindowsPhone WindowsMobile 其他手机 敏捷开发 项目管理 软件工程 SQLServer Oracle MySQL NoSQL 其它数据库 Windows7 WindowsServer Linux
   -> Windows Phone -> [UWP] 自定义一个ItemsPanel -> 正文阅读

[Windows Phone][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 = 0;
            double x = 0;

            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 = 0;
                    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 = 0;
                    y += itemSize.Height;
                }
                //控件的坐标
                Point pt = new Point(x, y);

                //控件布局
                item.Arrange(new Rect(pt, itemSize));
                x += itemSize.Width;
            }

            return finalSize;
        }

  Windows Phone 最新文章
[UWP] 自定义一个ItemsPanel
WP8.1程序开发中,如何加载本地文件资源或安
UWP 律师信息 MVVM 2.0版本
Win10 FaceAPI小demo开发问题汇总
【转】UWP 捕获全局异常
x:bind不支持样式文件 或 此Xaml文件必须又
WP模拟器修改语言为中文方法
wp仿系统截图
Windows Phone 8 锁屏背景与通知
博客园新闻WP8.1客户端
上一篇文章           查看所有文章
加:2017-04-27 02:09:44  更:2017-05-17 02:45:04 
 
360图书馆 软件开发资料 购物精选 新闻资讯 Chinese Culture 三丰软件 开发 中国文化 阅读网 日历 万年历 2019年12日历
2019-12-8 7:53:42
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  编程知识