LongListSelector也是WinPhone的特色控件之一,最初不了解这个控件叫啥名,知道它会在"人脉"里面出现,在应用程序列表也是这个LongListSelector(如果应用的数量多的话就会出现分组的标头),"音乐"里面的曲目使用了这个控件;其他非系统的应用也有使用这个LongListSelector:酷我音乐、微信、飞信、微博……

这个列表的快速跳转方式和Android的联系人侧边索引栏作用比较相似,从界面美观程度来说LongListSelector没那么好,但是从操作性来说LongListSelector就比较好了,容易被点击中。

这个LongListSelector在WP8的模板中存在于工具箱的"常用的Windows Phone控件"一栏中,在页面中添加LongListSelector控件

  1. <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
  2. <phone:LongListSelector
  3. x:Name="AddrBook"/>
  4. </Grid>

添加了控件,那要介绍一下LongListSelector的组成

如上图所示,一个LongListSelector有列表的表头(ListHeaderTemplate)、表尾(ListFooterTemplate)、组头(GroupHeaderTemplate)、组尾(GroupFooterTemplate)

鄙人对WPF没有系统地去了解,实践这个LongListSelector过程中让我了解到静态资源和依赖属性,上图右边的那个效果,xmal代码如下

  1. <phone:LongListSelector
  2. x:Name="AddrBook"
  3. JumpListStyle="{StaticResource AddrBookJumpListStyle}"
  4. Background="Transparent"
  5. GroupHeaderTemplate="{StaticResource AddrBookGroupHeaderTemplate}"
  6. GroupFooterTemplate="{StaticResource AddrBookGroupFooterTemplate}"
  7. ItemTemplate="{StaticResource AddrBookItemTemplate}"
  8. LayoutMode="List"
  9. IsGroupingEnabled="true"
  10. HideEmptyGroups ="true"/>

这里用到了三个Template一个Style,都是静态资源,它们的定义如下

  1. <phone:PhoneApplicationPage.Resources>
  2. <DataTemplate x:Key="AddrBookItemTemplate">
  3. <StackPanel VerticalAlignment="Top">
  4. <TextBlock Text="{Binding FirstName}"
  5. FontSize="40"
  6. local:MetroInMotion.AnimationLevel="3"
  7. local2:TiltEffect.IsTiltEnabled="True"/>
  8. </StackPanel>
  9. </DataTemplate>
  10. <DataTemplate x:Key="AddrBookGroupFooterTemplate">
  11. <Border Background="{StaticResource PhoneAccentBrush}"
  12. BorderBrush="{StaticResource PhoneAccentBrush}"
  13. BorderThickness="2"
  14. Width="62"
  15. Height="62"
  16. Margin="0,0,18,0"
  17. VerticalAlignment="Center"
  18. HorizontalAlignment="Left">
  19. <TextBlock
  20. Text="{Binding Key}"
  21. Foreground="{StaticResource PhoneForegroundBrush}"
  22. FontSize="48"
  23. Padding="6"/>
  24.  
  25. </Border>
  26. </DataTemplate>
  27. <DataTemplate x:Key="AddrBookGroupHeaderTemplate">
  28. <Border Background="Transparent" Padding="5">
  29. <Border Background="Transparent"
  30. BorderBrush="{StaticResource PhoneAccentBrush}"
  31. BorderThickness="2"
  32. Width="Auto"
  33. Height="62"
  34. Margin="0,0,18,0"
  35. HorizontalAlignment="Left">
  36. <TextBlock Text="{Binding ChineseKey}"
  37. Foreground="{StaticResource PhoneAccentBrush}"
  38. FontSize="48"
  39. Padding="6"
  40. FontFamily="{StaticResource PhoneFontFamilySemiLight}"
  41. HorizontalAlignment="Left"
  42. VerticalAlignment="Center"/>
  43. </Border>
  44. </Border>
  45. </DataTemplate>
  46. <phone:JumpListItemBackgroundConverter x:Key="BackgroundConverter"/>
  47. <phone:JumpListItemForegroundConverter x:Key="ForegroundConverter"/>
  48.  
  49. <Style x:Key="AddrBookJumpListStyle" TargetType="phone:LongListSelector">
  50. <Setter Property="GridCellSize" Value="200,113"/>
  51. <Setter Property="LayoutMode" Value="Grid"/>
  52. <Setter Property="ItemTemplate">
  53. <Setter.Value>
  54. <DataTemplate>
  55. <Border Background="{Binding Converter={StaticResource BackgroundConverter}}"
  56. Width="Auto" Height="113" Margin="6" >
  57. <TextBlock Text="{Binding ChineseKey}"
  58. FontFamily="{StaticResource PhoneFontFamilySemiBold}"
  59. FontSize="48" Padding="6"
  60. Foreground="{Binding Converter={StaticResource ForegroundConverter}}"
  61. VerticalAlignment="Center"/>
  62. </Border>
  63. </DataTemplate>
  64. </Setter.Value>
  65. </Setter>
  66. </Style>
  67. </phone:PhoneApplicationPage.Resources>

这里面就包含了三个Template一个Style,AddrBookItemTemplate的Template是组内各个Item的布局,AddrBookGroupFooterTemplate、AddrBookGroupHeaderTemplate,AddrBookJumpListStyle。

  • AddrBookItemTemplate里面就一个TextBlock,它的Text属性则绑定了数据源中的Key属性。
  • AddrBookGroupFooterTemplate则是一个主体色的62*62的矩形里面放一个TextBlock,TextBlock的Text也是绑定了数据源的Key属性。

这里用到的Temple和Style,让我想起了在Android里面用到的ListView,GridView里面等集合控件,这两个控件都需要用子项的布局文件,通过Adapter和ListView、GridView等空间关联起来,而在WinPhone就用

  1. ItemTemplate="{StaticResource AddrBookItemTemplate}"
  2.  
  3. <DataTemplate x:Key="AddrBookItemTemplate">
  4. <StackPanel VerticalAlignment="Top">
  5. <TextBlock Text="{Binding FirstName}"
  6. FontSize="40" />
  7. </StackPanel>
  8. </DataTemplate>

定义各个部分之间的布局。

这个LongListSelector所用的数据源的数据结构不是单纯的一个列表,它实际上是一个List<List<T>>,但特殊之处是他List<T>里面有分组用的属性。如下面的类

  1. public class AlphaKeyGroup<T> : List<T>
  2. {
  3.  
  4. /// <summary>
  5. /// The Key of this group.
  6. /// </summary>
  7. public string Key { get; private set; }
  8.  
  9. public string ChineseKey { get; private set; }
  10.  
  11. /// <summary>
  12. /// Public constructor.
  13. /// </summary>
  14. /// <param name="key">The key for this group.</param>
  15. public AlphaKeyGroup(string key)
  16. {
  17. Key = key;
  18. }
  19. }

类中的Key和ChineseKey都可以是作为分组的Key,按照微软的例子这个类还会有两个方法专门处理分组,要弄这个分组用的方法多种多样,如果直接构造的话可以写成这样

  1. List<AlphaKeyGroup<AddressBook>> result = new List<AlphaKeyGroup<AddressBook>>();
  2.  
  3. result.Add(new AlphaKeyGroup<AddressBook>("分组1")
  4. {
  5. new AddressBook("Joe", "Smith", "US", ""),
  6. new AddressBook("Jim", "Johnson", "UK", ""),
  7. new AddressBook("Mary", "Robert", "India", ""),
  8. new AddressBook("Patricia", "James", "France", ""),
  9. new AddressBook("Linda", "Williams", "Italy", ""),
  10. new AddressBook("David", "Jones", "US", ""),
  11. new AddressBook("Elizabeth", "Martinez", "US", ""),
  12. new AddressBook("Richard", "Robinson", "Germany", ""),
  13. new AddressBook("Charles", "Clark", "US", ""),
  14. });
  15. result.Add(new AlphaKeyGroup<AddressBook>("分组2")
  16. {
  17.  
  18. new AddressBook("Laura", "Crawford", "US", ""),
  19. new AddressBook("Anthony", "Burns", "US", ""),
  20. new AddressBook("Sarah", "Gordon", "India", ""),
  21. new AddressBook("Kevin", "Hunter", "US", ""),
  22. new AddressBook("Kimberly", "Tucker", "US", ""),
  23. });
  24. result.Add(new AlphaKeyGroup<AddressBook>("分组3")
  25. {
  26.  
  27. new AddressBook("Paul", "Hernandez", "US", ""),
  28. new AddressBook("Karen", "King", "US", ""),
  29. new AddressBook("Ruth", "Wright", "US", ""),
  30. new AddressBook("Steven", "Lopez", "US", ""),
  31. new AddressBook("Edward", "Hill", "US", ""),
  32. new AddressBook("Sharon", "Scott", "US", ""),
  33. new AddressBook("Brian", "Green", "US", ""),
  34. new AddressBook("Michelle", "Ramos", "US", ""),
  35. new AddressBook("Ronald", "Mason", "India", ""),
  36. });
  37. result.Add(new AlphaKeyGroup<AddressBook>("分组4")
  38. {
  39.  
  40. new AddressBook("Joseph", "Rodriguez", "France", ""),
  41. new AddressBook("Susan", "Lewis", "Italy", ""),
  42. new AddressBook("Thomas", "Lee", "US", ""),
  43. new AddressBook("Margaret", "Walker", "US", ""),
  44. });
  45. result.Add(new AlphaKeyGroup<AddressBook>("分组5")
  46. {
  47.  
  48. new AddressBook("Deborah", "Mills", "US", ""),
  49. new AddressBook("Matthew", "Warren", "US", ""),
  50. new AddressBook("Jessica", "Nichols", "US", ""),
  51. });
  52. result.Add(new AlphaKeyGroup<AddressBook>("分组6")
  53. {
  54.  
  55. new AddressBook("Christopher", "Hall", "UK", ""),
  56. new AddressBook("Lisa", "Allen", "US", ""),
  57. new AddressBook("Daniel", "Young", "US", ""),
  58. });
  59. result.Add(new AlphaKeyGroup<AddressBook>("分组7")
  60. {
  61. new AddressBook("Jason", "Dixon", "US", ""),
  62. new AddressBook("Gary", "Knight", "US", ""),
  63. new AddressBook("Shirley", "Ferguson", "US", ""),
  64. });

WinPhone学习笔记(五)——LongListSelector的更多相关文章

  1. C#可扩展编程之MEF学习笔记(五):MEF高级进阶

    好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...

  2. (转)Qt Model/View 学习笔记 (五)——View 类

    Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...

  3. java之jvm学习笔记五(实践写自己的类装载器)

    java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...

  4. Learning ROS for Robotics Programming Second Edition学习笔记(五) indigo computer vision

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  5. Typescript 学习笔记五:类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  6. ES6学习笔记<五> Module的操作——import、export、as

    import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...

  7. muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor

    目录 muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor Connector 系统函数connect 处理非阻塞connect的步骤: Connetor时序图 Accep ...

  8. python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍

    python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍 IDLE默认不能显示行号,使用ALT+G 跳到对应行号,在右下角有显示光标所在行.列.pycharm免费社区版.Su ...

  9. Go语言学习笔记五: 条件语句

    Go语言学习笔记五: 条件语句 if语句 if 布尔表达式 { /* 在布尔表达式为 true 时执行 */ } 竟然没有括号,和python很像.但是有大括号,与python又不一样. 例子: pa ...

  10. 【opencv学习笔记五】一个简单程序:图像读取与显示

    今天我们来学习一个最简单的程序,即从文件读取图像并且创建窗口显示该图像. 目录 [imread]图像读取 [namedWindow]创建window窗口 [imshow]图像显示 [imwrite]图 ...

随机推荐

  1. 《CLR.via.C#第三版》第一部分读书笔记(一)

    最近开始仔细研读<CLR.via.C#第三版>这本书.读pdf文档确实很累.建议有条件的朋友还是买书看吧. 我的笔记用来记录我对这本书的理解,简化下逻辑,对每个部分我觉得是要点的进行归纳总 ...

  2. JavaScript思维导图—变量

    JavaScript思维导图-来自@王子墨http://julying.com/blog/the-features-of-javascript-language-summary-maps/

  3. 使用 PowerShell 自动登录Azure

    PowerShell 是管理 Azure 的最好方式之一,通过使用 PowerShell 脚本可以把很多的工作自动化.比如对于 Azure 上的虚拟机,可以设置定时关机操作,并在适当的时间把它开机,这 ...

  4. xml存储bug

    最近遇到了一个bug,详细情况如下:用linq to xml写xml文件,在加载的时候代码为xDocument.Load(filePath),保存的时候为xDocument.Save(filePath ...

  5. jetty

    相关的文章太多了,我只按照自己的意思做简单总结. 参见: http://www.cnblogs.com/duanxz/p/3154982.html http://www.cnblogs.com/win ...

  6. CGFloat Float 互转

    直接上代码吧 var positionX:CGFloat = 10 var positionY:CGFloat = 20 var tmpX:Float = 30 var tmpY:Float = 40 ...

  7. Node.js与Sails~Model和ORM的持久化

    回到目录 上一讲说了在sails里定义model及相关参数的说明,这一讲主要说一下如何将你的Model持久化到文件,关系数据库和Nosql数据库里,在持久化这点上,sails是统一管理的,它可以在/c ...

  8. EF架构~EF6配置需要注意的几个地方

    回到目录 从EF5升级到EF6之后,可能会出现一些问题,这是正常的,任何系统的升级都没有一帆风顺的,当然这些不是我要说的重点,我真正要说的是,当出现这些问题时,我们应该如何去应对它,下面我总结了几个方 ...

  9. Node.js入门:Hello World

    马上开始我们第一个Node.js应用:“Hello World”.打开你的编辑器,创建一个hello.js文件.编写代码保存该文件,并通过Node.js来执行. 控制台输出 1 console.log ...

  10. Atitit 异常的实现原理 与用户业务异常

    Atitit 异常的实现原理 与用户业务异常 1.1. 异常的实现原理1 1.2. 用户业务异常1 1.3. 异常转译和异常链2 1.4. 避免异常2 1.5. 异常恢复3 1.6. catch代码块 ...