一个成型的产品,肯定是经过了产品经理出的UE,美工设计的UI,最终到我们手里Coding,这里面最少3个人,最多就不知道会有多少人参与了。每个人脑子想的都是不一样的,我就不粘贴那个“XX眼中的XX”那个图了。这次讲的是,遇到这么一个情况,项目列表在小屏幕状态下,因为项目的特殊描述在项目描述框里面放不下(一堆字都挤到一起了),产品经理和美工一商量,“嗯,如果屏幕过小就直接放在项目概要块的下面,而且有描述的显示,没描述的不显示”。开始我以为是一件很简单的事情,加几个判断就完了,后来才发现我是多么的 too young too simple……

如果像我那样简单的加个判断,有描述的时候显示,没描述的时候不显示,最后整个列表,每一个Item都会按照高度的最大值,去统一设置所有的数据项。那个间隔,那个难看,我就不说什么了。最后也是各种网上搜索,看到了一篇文章,现在实在想不起来看的是谁的了,这里就不特别感谢了。大家看过这类的解决方案,已经解决问题的,请忽略。下图所示效果,就是最终大麦的展示效果,列表中,有红色字体的描述,展示在项目卡片的下放,没有特别描述的,正常展示,所有间隔,所有样式正常。

 

实现效果,需要这么几个步骤:

Step 1,自定义一个可变宽度或高度的GridView,继承系统的GridView,复写PrepareContainerForItemOverride方法。

using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls; namespace Damai.Windows10.Tools
{
public class VariableWidthWrapGridView : GridView
{
protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
{
if (item is IvariableWidthWrapData)
{
element.SetValue(VariableSizedWrapGrid.ColumnSpanProperty, (item as IvariableWidthWrapData).GridColSpan);
element.SetValue(VariableSizedWrapGrid.RowSpanProperty, (item as IvariableWidthWrapData).GridRowSpan);
} base.PrepareContainerForItemOverride(element, item);
}
}
}

Step1.1,突然看到上面还用到了一个IvariableWidthWrapData,这个纯粹是我的一个习惯,考虑后面的数据Model必须要包含这两个属性,干脆定义了一个接口

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Damai.Windows10.Tools
{
public interface IvariableWidthWrapData
{
/// <summary>
/// 跨越行(1开始)
/// </summary>
int GridRowSpan { get; set; } /// <summary>
/// 列跨越(1开始)
/// </summary>
int GridColSpan { get; set; }
}
}

Step2,修改你的数据Model,将需要绑定界面的数据,实现刚才那个接口,初始赋值

using Damai.Windows10.Tools;

namespace Damai.Windows10.App
{
/// <summary>
/// 搜索结果
/// </summary>
public class SearchResultModel : BaseModel, IvariableWidthWrapData
{
public SearchResultModel()
{
GridColSpan = ;
GridRowSpan = TempDataInfo.IsPhoneMode ? : ;
} // 其他属性我都删除了 /// <summary>
/// 跨行
/// </summary>
public int GridRowSpan
{
get
{
return _gridRowSpan;
}
set
{
_gridRowSpan = value;
RasiePropertyChangedEvent("GridRowSpan");
}
} public int GridColSpan
{
get
{
return _gridColSpan;
}
set
{
_gridColSpan = value;
RasiePropertyChangedEvent("GridColSpan");
}
}
}
}

Step3,修改界面的GridView控件,使用自定义的GridView控件,并修改ItemsPanel,使用VariableSizeWrapGrid。这里我需要自定义的是控件的高度,所以我就定义ItemHeight为1,这样后续我只要判断是否有特殊说明,有说明的,GridRowSpan赋值多一些,没有说明的,赋值少一些,就Ok了

<Tool:VariableWidthWrapGridView x:Name="gridViewHotList" RelativePanel.Below="tblockTip" IsItemClickEnabled="True" ItemClick="gridViewHotList_ItemClick" Margin="20,0,0,0" SelectionMode="None">

                <GridView.ItemsPanel>
<ItemsPanelTemplate>
<VariableSizedWrapGrid Orientation="Horizontal" ItemHeight=""/>
</ItemsPanelTemplate>
</GridView.ItemsPanel> <GridView.ItemTemplate>
<DataTemplate>
<local:ProjectCardView DataContext="{Binding}" Margin="{Binding ElementName=rectangleMargin, Path=Margin}" Width="{Binding ElementName=rectangleWidth, Path=Width}"/>
</DataTemplate>
</GridView.ItemTemplate> </Tool:VariableWidthWrapGridView>

分享大麦UWP版本开发历程-02.内容“高度/宽度”不同的列表展示的更多相关文章

  1. 分享大麦UWP版本开发历程-01.响应式轮播顶部焦点图

    话说有一天,临近下班无心工作,在网上看各种文章,阅读到了一篇名为<聊聊大麦网UWP版的首页顶部图片联动效果的实现方法>(传递:http://www.cnblogs.com/hippieZh ...

  2. 分享大麦UWP版本开发历程-03.GridView或ListView 滚动底部自动加载后续数据

    今天跟大家分享的是大麦UWP客户端,在分类.订单或是搜索时都用到的一个小技巧,技术粗糙大神勿喷. 以大麦分类举例,默认打开的时候,会为用户展示20条数据,当用户滚动鼠标或者使用手势将列表滑动到倒数第二 ...

  3. 微信小程序分享朋友圈 长海报 canvas 动态高度计算

    业务场景 在微信中 小程序无法分享到朋友圈,目前大部分的解决方案都是,canvas动态绘制 生成图片后,保存到用户相册,用户进行分享照片到朋友圈,朋友圈打开图片后识别二维码进入小程序,达到分享目的 g ...

  4. flex自适应高度内容高度超出容器高度自动出现滚动条的问题

    在容器中设置 flex-grow:2; overflow-y:auto;overflow-x:hidden;容器高度自适应. 内容高度不固定,无法出现滚动条,然后在容器中添加height:0,出现滚动 ...

  5. 让动态的 iframe 内容高度自适应

    使用iframe加载其他页面的时候,需要自适应iframe的高度 这里加载了两个不同内容高度的页面至iframe中 1. 没有设置高度 <div class="iframe-wrapp ...

  6. ios webview自适应实际内容高度4种方法

    有的时候会碰见类似的苦逼需求, webview自适应实际内容高度 下面有四种方法供使用 方法1:获取webview中scrovllview的contentsize进行设置   1 2 3 4 5 6 ...

  7. WPF设置DataGrid行内容高度自适应 与 TextBox/TextBlock内容高度自适应

    WPF设置DataGrid行内容高度自适应  TextBox/TextBlock内容高度自适应  参考: DataGrid 控件中的调整大小选项: http://msdn.microsoft.com/ ...

  8. UIWebView如何获取内容高度

    iOS UIWebView如何获取到内容的高度呢?我们经常会遇到项目中需要使用UIWebView来加载H5页面,但是页面的高度并不确定,而我们前端需要根据内容的高度呈现出来,且不允许webview滚动 ...

  9. swift 如何获取webView的内容高度

    应用中如果使用webView,要想获取其内容高度,就要实现其代理方法, 首先添加代理UIWebViewDelegate 然后给代理赋值 webView.delegate = self 实现代理方法: ...

随机推荐

  1. java学习笔记(5) 控制语句、键盘输入

    控制语句: java控制可以分为7种: *控制选择结构语句: *if  if else *switch *控制循环结构语句: *for *while *do while *改变控制语句顺序: *bre ...

  2. 「PKUSC2018」PKUSC

    传送门 Solution  考虑求每个点的贡献 等价于一个以OA长为半径的圆心为原点的圆在多边形内的弧对应的角度/\(2\pi\) 求弧度可以利用三角剖分 在原点的点要特判,采用射线法就可以了 Cod ...

  3. dedecms 模板文件不存在,无法解析文档的终极各种解决办法

    dedecms 模板文件不存在,无法解析文档"的终极各种解决办法 方法一:[此对应喜欢把模板文件使用".html"的格式,] /include/arc.archives. ...

  4. HDFS练习

    利用Shell命令与HDFS进行交互 以”./bin/dfs dfs”开头的Shell命令方式 1.目录操作 在HDFS中为hadoop用户创建一个用户目录(hadoop用户) 在用户目录下创建一个i ...

  5. Tomcat启动时,控制台和IDEA控制台中文乱码解决方案

    Tomcat启动时 控制台中文乱码 cmd控制台 IDEA控制台 解决方案 cmd乱码 打开Tomcat目录下的apache-tomcat-8.5.47\conf\logging.properties ...

  6. SpringBoot框架 之 Druid与Swagger2

    目录 Druid Druid连接池配置 Druid数据监控 集成Swagger2 Swagger2简介 1.添加依赖 2.创建Swagger2配置类 3.在控制器方法上添加对应api信息 4.启动Sp ...

  7. Java 面向对象(九)

    常用类之Random Random类位于 java.util 包中,主要用于生成伪随机数 Random类将种子数作为随机算法的起源数字,计算生成伪随机数,其与生成的随机数字的区间无关 创建Random ...

  8. openstack重设虚拟机实例密码

    目录结构: 引出 采用 nova get-password 方式 采用 libvirt-set-admin-password 采用 nova rebuild instance 的方式 采用 cloud ...

  9. 日志分类以及TFIDF

    TF的概念是Term Frequent,是一个单词出现的频率,是一个局部概念,就是这个单词在指定文件中出现的频率,公式如下: 但是呢,这个TF其实很没有说服力,比如the,a之类的频率很高,但是其实不 ...

  10. [LeetCode] 112. Path Sum 路径和

    Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all ...