六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 350|回复: 0

WPF:分类的可收缩的WrapPanel列表

[复制链接]

升级  67.33%

128

主题

128

主题

128

主题

举人

Rank: 3Rank: 3

积分
402
 楼主| 发表于 2013-1-3 15:35:46 | 显示全部楼层 |阅读模式
<div class="postcontent"><div id="cnblogs_post_body">效果如下,WrapPanel样式的列表同时支持分类。
  
   
  如果点击分类列表Header后,相应的类别子元素会收缩。
  
   
   
  起初想用ListBox实现,但是很快被WrapPanel和GroupStyle整的一头雾水。同时对WPF中数据源ICollectionView的分类是采用PropertyGroupDescription这种靠反射来执行的逻辑表示不爽,最终定自己写一个类似的控件。
   
  
  核心类型WrapList继承自WrapPanel。
  三个非常基础的WPF常见控件/数据样式选项:HeaderStyle,HeaderTemplate和ItemTemplate分别设置类型Header的Style和Data Template,以及子元素的Data Template。
  同时还有一个WrapListGroupHeader控件代表类型Header的显示控件,它就是一个ToggleButton,在点击后会自动收缩其子项目。
   
  ItemsSource类型是object,但是它只支持IEnumerable<IGrouping<TKey, TElement>>类型,没有使用WPF中ICollectionView的PropertyGroupDescription,而是LINQ中GroupBy返回的原生结果。当ItemsSource被设置后,元素即会被显示。
   
  那么数据源的设置的示例代码:
  <div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 10px; background-color: #262626; margin: 12px; padding-left: 10px; padding-right: 10px; border-top: gray 1px solid; border-right: gray 1px solid; padding-top: 10px" class="mgen_code">   //mylist是WrapList控件的名称
    //设置WrapList的数据源为1-50余3的结果
    var groups = Enumerable.Range(1, 50).GroupBy(i => i % 3);
    mylist.ItemsSource = groups;
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表