11.1.5 SemanticZoom实现分组列表

SemanticZoom控件可以让用户实现一种更加高级的列表,这种列表可以对列表的项目进行分组,同时这个SemanticZoom控件会提供两个具有相同内容的不同视图,其中有一个是主视图,另外一个视图可以让用户进行快速导航的分组视图。例如,Windows Phone里面的人脉通讯录列表就是使用SemanticZoom控件实现的。

SemanticZoom控件支持对GridView和ListView控件的视图效果进行缩放,在SemanticZoom控件中需要包含两个列表控件(GridView或ListView):一个控件提供放大视图,另外一个提供缩小视图。放大视图提供一个详细信息视图(ZoomedInView)以让用户查看详细信息,缩小视图提供一个缩小索引视图(ZoomedOutView)让用户快速定位想要查看信息的大概范围或者分组。下面我们从控件的样式设置和数据源创建两个方面来介绍SemanticZoom控件的使用:

(1)SemanticZoom控件的样式设置

SemanticZoom控件实现分组列表会比实现非分组的列表要复杂一些,实现分组列表还需要设置两大属性的内容:ZoomedOutView的内容和ZoomedInView的内容。这两个属性的内容含义如下所示:

<SemanticZoom.ZoomedInView>

<!--在这里放置GridView(或ListView)以表示放大视图,显示详细信息-->

</SemanticZoom.ZoomedInView>

<SemanticZoom.ZoomedOutView>

<!--在这里放置GridView(或ListView)以表示缩小视图,一般情况下绑定Group.Title-->

</SemanticZoom.ZoomedOutView>

在赋值给ZoomedInView属性的列表控件里面,我们一般需要设置它的ItemTemplate模板和GroupStyle.HeaderTemplate模板。ItemTemplate模板要设置的内容就是列表详细信息所展示的内容,GroupStyle.HeaderTemplate模板是指分组的组头模板,如在人脉里面的“a”、“b”……这些就是属于列表的组头,组头也一样是一个列表的集合的也是通过模板的绑定形式来进行定义。

在赋值给ZoomedOutView属性的列表控件里面,我们也需要设置其ItemTemplate模板,在这里要注意的是ZoomedOutView里面的ItemTemplate模板和ZoomedInView里面的模板所产生的作用是不一样的,这里的ItemTemplate模板是指当你点击组头的时候弹出的组头的索引面板的项目展示,如点击人脉里面的“a”、“b”……就会弹出一个字母的现实面板,当你点击某个字母的时候就会从新回到列表的界面并且跳到列表该字母所属的组项目的位置。同时你还可以使用ItemsPanel来设置列表的布局,使用ItemContainerStyle来设置列表项目的容器样式等等,这些功能的使用是和单独的GridView(或ListView)列表的使用是一样的。

(2)SemanticZoom控件的数据源创建

SemanticZoom控件的数据源创建需要用到用到Windows.UI.Xaml.Data命名空间下的CollectionViewSource。CollectionViewSource是专为数据绑定有UI视图互动而设的,尤其是对于要实现分组的情况下,更需要它。创建一个CollectionViewSource对象我们既可以使用XAML的方式来进行创建也可以使用C#代码来直接创建,实现的效果是等效的。在CollectionViewSource对象中我们通常需要设置下面几个重要的属性:

1)Source属性:是设置分组后的数据源,赋值给Source属性的对象是列表嵌套列表的集合对象;

2)IsSourceGrouped属性:指示是否允许分组;

3)ItemsPath属性:是分组后,组内部所包含列表的属性路径;

  4)View属性:获取当前与CollectionViewSource的此实例关联的视图对象;

5)View.CollectionGroups属性:返回该视图关联的所有集合组。

那么在绑定数据的时候我们需要把ZoomedInView里面的列表控件的ItemsSource绑定到CollectionViewSource对象的View属性,用于展示CollectionViewSource对象关联的视图;把ZoomedOutView里面的列表控件的ItemsSource绑定到CollectionViewSource对象的View.CollectionGroups属性,用于展示分组的视图。

下面我们用一个简洁的例子来实现这样一个分组列表的数据组织逻辑和相关模板样式的设置,代码如下所示:

代码清单11-5SemanticZoom分组列表(源代码:第11章\Examples_11_5)

MainPage.xaml文件主要代码
------------------------------------------------------------------------------------------------------------------
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<Grid.Resources>
<!--创建数据源对象,注意ItemContent属性就是数据源中真正的基础数据的列表的属性,必须设置该属性的值数据源才能定位到实际绑定的数据实体对象-->
<CollectionViewSource x:Name="itemcollectSource" IsSourceGrouped="true" ItemsPath="ItemContent" />
</Grid.Resources>
<SemanticZoom x:Name="semanticZoom">
<SemanticZoom.ZoomedInView>
<!-- 在这里放置GridView(或ListView)以表示放大视图 -->
<ListView x:Name="inView">
<ListView.GroupStyle>
<GroupStyle>
<!--用于显示列表头的数据项的模板-->
<GroupStyle.HeaderTemplate>
<DataTemplate>
<Border Background="Red" Height="80"> <TextBlock Text="{Binding Key}" FontSize="50"></TextBlock>
</Border>
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
</ListView.GroupStyle>
<!--用于显示列表的数据项的模板-->
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Title}" Height="40" FontSize="30"></TextBlock>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</SemanticZoom.ZoomedInView>
<SemanticZoom.ZoomedOutView>
<!-- 在这里放置GridView(或ListView)以表示缩小视图 -->
<GridView x:Name="outView">
<!--用于显示弹出的分组列表视图的数据项的模板-->
<GridView.ItemTemplate>
<DataTemplate>
<Border Height="60">
<TextBlock Text="{Binding Group.Key}" FontSize="24"></TextBlock>
</Border>
</DataTemplate>
</GridView.ItemTemplate>
<!--列表布局模板-->
<GridView.ItemsPanel>
<ItemsPanelTemplate>
<WrapGrid ItemWidth="100" ItemHeight="75" MaximumRowsOrColumns="1" VerticalChildrenAlignment="Center" />
</ItemsPanelTemplate>
</GridView.ItemsPanel>
<!--列表项目容器的样式设置-->
<GridView.ItemContainerStyle>
<Style TargetType="GridViewItem">
<Setter Property="BorderBrush" Value="Gray" />
<Setter Property="Background" Value="Red" />
<Setter Property="BorderThickness" Value="3" />
<Setter Property="HorizontalContentAlignment" Value="Center" />
<Setter Property="VerticalContentAlignment" Value="Center" />
</Style>
</GridView.ItemContainerStyle>
</GridView>
</SemanticZoom.ZoomedOutView>
</SemanticZoom>
</Grid>
MainPage.xaml.cs文件主要代码
------------------------------------------------------------------------------------------------------------------
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
// 先创建一个普通的数据集合
List<Item> mainItem = new List<Item>();
for (int i = ; i < ; i++)
{
mainItem.Add(new Item { Content = "A类别", Title = "Test A" + i });
mainItem.Add(new Item { Content = "B类别", Title = "Test B" + i });
mainItem.Add(new Item { Content = "C类别", Title = "Test C" + i });
}
// 使用LINQ语法把普通的数据集合转换成分组的数据集合
List<ItemInGroup> Items = (from item in mainItem group item by item.Content into newItems select new ItemInGroup { Key = newItems.Key, ItemContent = newItems.ToList() }).ToList();
// 设置CollectionViewSource对象的数据源
this.itemcollectSource.Source = Items;
// 分别对两个视图进行绑定
outView.ItemsSource = itemcollectSource.View.CollectionGroups;
inView.ItemsSource = itemcollectSource.View;
}
}
// 分组的实体类,也就是分组的数据集合最外面的数据项的实体类
public class ItemInGroup
{
// 分组的组头属性
public string Key { get; set; }
// 分组的数据集合
public List<Item> ItemContent { get; set; }
}
// 列表的数据实体类
public class Item
{
public string Title { get; set; }
public string Content { get; set; }
}

本文来源于《深入理解Windows Phone 8.1 UI控件编程》

本书更多试读文章:http://www.cnblogs.com/linzheng/p/3763382.html

源代码下载:http://vdisk.weibo.com/s/zt_pyrfNHoezI

欢迎关注我的微博@WP林政   微信公众号:wp开发(号:wpkaifa)

WP8.1技术交流群:372552293

[WP8.1UI控件编程]SemanticZoom控件实现分组列表的更多相关文章

  1. 《深入理解Windows Phone 8.1 UI控件编程》基于最新的Runtime框架

    <深入理解Windows Phone 8.1 UI控件编程>本书基于最新的Windows Phone 8.1 Runtime SDK编写,全面深入地论述了最酷的UI编程技术:实现复杂炫酷的 ...

  2. [WP8.1UI控件编程]Windows Phone XAML页面的编译

    1.1.2 XAML页面的编译 Windows Phone的应用程序项目会通过Visual Studio完成XAML页面的编译,在程序运行时会通过直接链接操作加载和解析XAML,将XAML和过程式代码 ...

  3. [WP8.1UI控件编程]Windows Phone大数据量网络图片列表的异步加载和内存优化

    11.2.4 大数据量网络图片列表的异步加载和内存优化 虚拟化技术可以让Windows Phone上的大数据量列表不必担心会一次性加载所有的数据,保证了UI的流程性.对于虚拟化的技术,我们不仅仅只是依 ...

  4. [WP8.1UI控件编程]Windows Phone VirtualizingStackPanel、ItemsStackPanel和ItemsWrapGrid虚拟化排列布局控件

    11.2.2 VirtualizingStackPanel.ItemsStackPanel和ItemsWrapGrid虚拟化排列布局控件 VirtualizingStackPanel.ItemsSta ...

  5. [WP8.1UI控件编程]Windows Phone动画方案的选择

    8.1 动画方案的选择 Windows Phone的动画实现方式有线性插值动画(3种类型).关键祯动画(4种类型)和基于帧动画,甚至还有定时器动画,然后动画所改变的UI元素属性可以是普通的UI元素属性 ...

  6. [WP8.1UI控件编程]Windows Phone理解和运用ItemTemplate、ContentTemplate和DataTemplate

    2.2.5 ItemTemplate.ContentTemplate和DataTemplate 在理解ItemTemplate.ContentTemplate和DataTemplate的关系的之前,我 ...

  7. [WP8.1UI控件编程]Windows Phone自定义布局规则

    3.2 自定义布局规则 上一节介绍了Windows Phone的系统布局面板和布局系统的相关原理,那么系统的布局面板并不一定会满足所有的你想要实现的布局规律,如果有一些特殊的布局规律,系统的布局面板是 ...

  8. [UWP] 使用SemanticZoom控件

    在写一个看新闻软件的时候,用到了SemanticZoom控件,遇到了一些问题,比如如何根据首字母分类,以及放大视图中有数据的和没数据的通过背景色或前景色区分,幸运的是,all solved. 先来个效 ...

  9. 金蝶 K/3 Cloud 服务端控件编程模型

    如下图是服务端已有的控件编程模型

随机推荐

  1. js获取url参数值(HTML之间传值)

    <h3>未设置设备: <a href="javascript:addTab('设备列表','PKE_DeviceContent/PKE_DeviceContent.aspx ...

  2. 与你相遇好幸运,Tippecanoe用法

    //todo 基本用法: tippecanoe -o file.mbtiles [file.json ...] 参数解释: <必须>   -o myFileName.mbtiles  或者 ...

  3. ASP.NET Web API 数据验证

    第一种方式单独为每一个Action做验证 // POST api/values public HttpResponseMessage Post([FromBody]UserInfo userInfo) ...

  4. SQL SERVER 统计信息概述(Statistics)

    前言 查询优化器使用统计信息来创建可提高查询性能的查询计划,对于大多数查询,查询优化器已经为高质量查询计划生成必要的统计信息,但是在少数情况下,您需要创建附加的统计信息或者修改查询设计以得到最佳结果. ...

  5. LIS的nlogn

    nlogn老忘,开个帖记录一下 开一个栈,每次取栈顶元素top和读到的元素temp做比较,如果temp > top 则将temp入栈:如果temp < top则二分查找栈中的比temp大的 ...

  6. bat学习

    http://www.cnblogs.com/gaohongchen01/p/4042047.html http://www.cnblogs.com/amylis_chen/p/3585339.htm ...

  7. javascript 简单加解密

    //加密 function MyEncrypt(txt) { var sb = ""; var rand = 0; for (var i=0;i<txt.length;i++ ...

  8. Git 基础操作

    [TOC] 在Linux上安装Git $ git --version #查看git的版本号 $ sudo apt-get install git # 安装git 创建版本库 $ git init # ...

  9. 湖南省第十二届大学生计算机程序设计竞赛 F 地铁 多源多汇最短路

    1808: 地铁 Description Bobo 居住在大城市 ICPCCamp. ICPCCamp 有 n 个地铁站,用 1,2,…,n 编号. m 段双向的地铁线路连接 n 个地铁站,其中第 i ...

  10. Ubuntu14 搭载vim环境查看源码

    首先是下载完整的vim74,然后编译安装.遗憾的是当编译时,没有开启图形界面. 在安装新版本的Vim之前,你需要卸载原来安装的老版本Vim,依次在终端下执行下列命令: sudo apt-get rem ...