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. 实现VS2010整合NUnit进行单元测试(转载)

    代码编写,单元测试必不可少,简单谈谈Nunit进行单元测试的使用方式: 1.下载安装NUnit(最新win版本为NUnit-2.6.4.msi) http://www.nunit.org/index. ...

  2. SQL语法中的子查询Subqueries

    记一下样子. 明白它的应用场景. SELECT account_id, product_cd, cust_id, avail_balance FROM account WHERE open_emp_i ...

  3. Android 线程更新UI报错 : Can't create handler inside thread that has not called Looper.prepare()

    MainActivity中有一个按钮,绑定了save方法 public void save(View view) { String title = titleText.getText().toStri ...

  4. 腾讯微博的账号登录及api操作

    .tqq.php <?php /** * PHP Library for t.qq.com * * @author */ class tqqPHP { function __construct( ...

  5. PHP计算程序运行时间的类

    <?php class runTime{ private $starTime; private $stopTime; private function getMicTime(){ $mictim ...

  6. WPF实现TextBox水印效果

    在日常项目中,一个TextBox需要输入用户名,我们通常的做法是先用一个TextBlock来说明,例如下面的截图: 今天将使用另外一种方式来展示,使用水印的方式.请参考下面的代码: <Windo ...

  7. Computer Graphics Research Software

    Computer Graphics Research Software Helping you avoid re-inventing the wheel since 2009! Last update ...

  8. python客户端编程

    上一篇说了最为底层的用来网络通讯的套接字.有很多基于套接字的一些协议,这些协议构成了当今互联网大多数客户服务器应用的核心 其实这些协议时在套接字上面的进一层封装用来完成特定的应用,这些应用主要包括: ...

  9. IM即时通讯实现原理

      即时通讯(Instant Messenger,简称IM)软件多是基于TCP/IP和UDP进行通讯的,TCP/IP和UDP都是建立在更低层的IP协议上的两种通讯传输协议.前 者是以数据流的形式,将传 ...

  10. SQLServer 维护脚本分享(10)索引

    --可添加索引的字段 migs.user_seeks,migs.avg_total_user_cost,migs.avg_user_impact,migs.last_user_seek ,mid.st ...