WPF如何用TreeView制作好友列表、播放列表

前言

  TreeView这个控件对于我来说是用得比较多的,以前做的小聊天软件(好友列表)、音乐播放器(播放列表)、类库展示器(树形类结构)等都用的是TreeView,下面以一个好友列表为例,说明一下制作过程,这个过程可以搬迁到其他类似的场景中去(树形结构的场景)。

结果展示

  

制作过程

  一:新建一个WPF工程,我命名为TreeViewDemo。(这步不解释)

  二:准备图片,就是系统头像。在工程中新建一个Heads文件夹,并且添加系统头像图片,最后不要忘记需要把生成方式改为Resource、不复制,这样才能用标准的Pack URI的方式来读取到图片。(我喜欢用Pack Uri,因为比较通用,安全)  下载头像

  三:好了,资源图片准备好了以后,来定义数据类,在这里我们需要用到两个类,一个代表好友,一个代表好友列表(对应的音乐播放器就是音乐和音乐列表)。

  1.Friend(好友)

class Friend{public Friend(FriendList list){this.List = list;}//头像的路径public String HeadPath { set; get; }//好友名字public String Name { set; get; }//签名public String Autograph { set; get; }public FriendList List { set; get; }}

  2.FriendList(好友列表)

class FriendList{public FriendList(String name){this.ListName = name;}public String ListName { set; get; }private ObservableCollection<Friend> _friends = new ObservableCollection<Friend>();public ObservableCollection<Friend> Friends{private set{}get{return _friends;}}public void AddFriend(Friend newFriend){_friends.Add(newFriend);}public void RemoveFriend(Friend friend){_friends.Remove(friend);}}

  四:这一步是重点,就是在一个TreeView的节点中,如何去区分Friend和FriendList呢?我使用模板,我分别为Friend和FriendList定义属于它们各自的模板,一起定义在一个字典中,新建一个字典,我命名为GlobeDictionary。这里应该要用的是数据模板(DataTemplate),系统有一个数据模板叫HierarchicalDataTemplate,这个模板专门用于有头部和子数据的数据结构的,用在这个TreeView中刚好合适。

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:TreeViewDemo"><HierarchicalDataTemplate DataType="{x:Type local:FriendList}" ItemsSource="{Binding Path=Friends,UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" x:Key="ListTemple" ><Border x:Name="bord" Margin="-1,-1,0,-1"><TextBlock Text="{Binding Path=ListName, Mode=TwoWay}" HorizontalAlignment="Left" Width="227" Padding="2" FontSize="15"></TextBlock></Border></HierarchicalDataTemplate><HierarchicalDataTemplate DataType="{x:Type local:Friend}"  x:Key="FriendTemple"><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="40"></ColumnDefinition><ColumnDefinition Width="150"></ColumnDefinition></Grid.ColumnDefinitions><Image Source="{Binding Path=HeadPath}" ></Image><StackPanel Orientation="Horizontal" Grid.Column="1" Margin="6,2,2,2"><StackPanel Orientation="Vertical"><TextBlock Text="{Binding Path=Name}"  Height="25" HorizontalAlignment="Left" ></TextBlock><TextBlock Text="{Binding Path=Autograph}"  Height="20" HorizontalAlignment="Left"></TextBlock></StackPanel></StackPanel></Grid></HierarchicalDataTemplate></ResourceDictionary>

  (注意:因为需要再这里引用自定义类,所以命名空间local的引入一定要正确,冲上面的定义可以看出,好友列表只显示名字,好友就用Grid来组织一个类QQ的布局,头像,签名等。)

  五:主界面。

  主界面比较简单,在这个Demo中,只使用TreeView控件。

<Window x:Class="TreeViewDemo.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:TreeViewDemo"Title="MainWindow" Height="401" Width="305"><Grid><TreeView x:Name="ListTV" ></TreeView></Grid>
</Window>

  

  六:有了躯壳,我们填入灵魂(数据绑定和数据模板应用)。

  模板有两个,直接填充TreeView的ItemTemplate属性是不行的,但是WPF中有一个思想很重要(Selector、Converter等),在TreeView中有一个属性ItemTemplateSelector。所以,新建一个Selector类,继承DataTemplateSelector:

class FriendOrListTemplateSelector : DataTemplateSelector{public override DataTemplate SelectTemplate(object item, DependencyObject container){ResourceDictionary directory = new ResourceDictionary();directory.Source = new Uri("pack://Application:,,,/GlobeDictionary.xaml", UriKind.RelativeOrAbsolute);//使用pack uri载入模板字典if (item != null && item is FriendList){return directory["ListTemple"] as DataTemplate;}return directory["FriendTemple"] as DataTemplate;}}

  首先使用pack uri加载位于当前exe程序集中的字典资源(如果加载不了,请将字典生成方式改为Resource),然后根据传入的数据类型来返回对应的DataTemplate,这样就能有效的自动选择模板。

  模板能自动选择了,另外数据怎么提供呢,我们使用在WPF中最常用的DataContext绑定来填充ItemsSource。下面看主界面的完整代码。

<Window x:Class="TreeViewDemo.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:TreeViewDemo"Title="MainWindow" Height="401" Width="305"><Grid><Grid.Resources><local:FriendOrListTemplateSelector x:Key="Myselector"></local:FriendOrListTemplateSelector></Grid.Resources><TreeView x:Name="ListTV" ItemsSource="{Binding Path=DataContext, Mode=TwoWay,RelativeSource={RelativeSource Mode=Self}}"ItemTemplateSelector="{StaticResource Myselector}" ></TreeView></Grid>
</Window>

  这里的命名空间local是FriendOrListTemplateSelector所在的命名空间中,请填写对。最后在主界面的代码中加入数据,测试一下。

public partial class MainWindow : Window{public MainWindow(){InitializeComponent();ObservableCollection<FriendList> Root = new ObservableCollection<FriendList>();FriendList listOne = new FriendList("高中同学");Friend friend1 = new Friend(listOne) { Autograph = "今天很开心,遇到了XX", HeadPath = "Heads/h1.png", Name = "天煞" };Friend friend2 = new Friend(listOne) { Autograph = "非一般的感觉", HeadPath = "Heads/h2.png", Name = "Basx" };Friend friend3 = new Friend(listOne) { Autograph = "WER", HeadPath = "Heads/h3.png", Name = "Paul" };Friend friend4 = new Friend(listOne) { Autograph = "~终于完成作业了~~!", HeadPath = "Heads/h4.png", Name = "孤星月" };listOne.AddFriend(friend1);listOne.AddFriend(friend2);listOne.AddFriend(friend3);listOne.AddFriend(friend4);FriendList listTwo = new FriendList("大一");Friend friend5 = new Friend(listOne) { Autograph = "你的存在", HeadPath = "Heads/h5.png", Name = "菲菲" };listTwo.AddFriend(friend5);Root.Add(listOne);Root.Add(listTwo);this.ListTV.DataContext = Root;}}

  大功告成~!

总结

  过程比较简单,但是最重要的是学习其方法,有几点通用的知识需要注意的:

    1.Xaml中需要使用自定义类的时候,需要在头部xmlns中添加一项,并且确保命名空间是对的。

    2.Pack URI的使用,任何资源的引用都可以使用Pack URI,下面举两个例子:

      *pack://Application:,,,/路径/路径/文件名(带后缀)    <-这种方式是引用当前程序集的Resouce资源的。

      *pack://Application:,,,/引用的程序集名称;component/路径/路径/文件名(带后缀)<-这种方式是引用其他程序集的Resouce资源的。

    3.选择器(Selecter),转换器(Converter)等的思想要深入理解。

    4.数据模板是为数据定制外观,例如这里就为Friend和FriendList定制了外观了。

                                                完整Demo下载

转载于:https://www.cnblogs.com/Jarvin/p/3792171.html

WPF如何用TreeView制作好友列表、播放列表相关推荐

  1. android制作好友列表,Qt制作QQ好友列表

    郁闷了好长时间,QQ列表怎么做呢,前一篇文章说想重写QTreeView,还要写个库,有点说大话了.其实一开始我就被骗了.因为当我看QQ列表的第一印象是用List,第2印象是用TreeView,第三我就 ...

  2. python制作微信个人二维码_如何用Python制作微信好友个性签名词云图

    前言 上次查看了微信好友的位置信息,想了想,还是不过瘾,于是就琢磨起了把微信好友的个性签名拿到,然后分词,接着分析词频,最后弄出词云图来. 1.环境说明 Win10 系统下 Python3,编译器是 ...

  3. 如何用VB制作DLL文件

    1.新建一个ActiveX Dll,工程名字为vbmytestdll,类模块名字为mytestdll  2.类模块内容只有一个函数,主要返回DLL的HELLO WORLD  Public Functi ...

  4. python可视化迷宫求解_如何用 Python 制作一个迷宫游戏

    相信大家都玩过迷宫的游戏,对于简单的迷宫,我们可以一眼就看出通路,但是对于复杂的迷宫,可能要仔细寻找好久,甚至耗费数天,然后可能还要分别从入口和出口两头寻找才能找的到通路,甚至也可能找不到通路. 虽然 ...

  5. 自动抓取QQ好友列表?Windows UIA教你轻松实现

    目录:导读 引言 选择Windows UIA框架进行自动化测试的原因 查找窗口 读取QQ软件的好友列表 结语 引言 每个使用QQ的人都有自己的好友列表,但是如果你想要查看所有好友信息,手动一个个点击会 ...

  6. 如何用HTML5制作iPhone App

    如何用HTML5制作iPhone App 你在这一年中很受挫,我知道的.所有的object-c的开发者都有一段在iPhone上写程序的痛苦经历.你曾经想找一两篇iPhone开发的初级教程,但是它的C语 ...

  7. 做网页是用dw还是html,教你如何用Dreamweaver制作网页以及保存网页的方法--系统之家...

    如何用Dreamweaver(DW)制作网页并保存网页呢?我就在这里教给大家最基础的创建网页和保存网页的方法教程,希望能帮到有需要的朋友. 启动软件后,在左上角点击[文件],在下拉菜单中点击[新建]. ...

  8. 如何用c#制作QQ农场外挂

    前一篇文章我大致写了一下如何制作QQ农场外挂,最近我的外挂运行了一段时间,觉得还行,所以拿出来给大家下载试用试用 大致功能有: 1.我的资料,查看我的等级,经验,金钱等信息 2.我的农场:可以查看我的 ...

  9. 视频如何用软件制作字幕?推荐这款专业性强的软件

    视频如何用软件制作字幕?可以用万兴喵影来制作视频字幕哦,特别喜欢万兴喵影超多的文字效果,可以根据不同场景.不同需求来选择需要的字幕效果. 那么,怎么用万兴喵影制作字幕呢? 第一步:打开万兴喵影,在&q ...

最新文章

  1. 简明 Git 命令速查表(中文版)
  2. matlab 查看函数属性,matlab – 使用FFT属性查找2D函数的导数
  3. 2013工资新规定,未来的八种人将会被淘汰!
  4. ITK:查看矢量图像的分量
  5. Matlab 图像的邻域和块操作
  6. 温度测量系统流程图_土壤温度和水分含量是如何调控城市草坪土壤N2O通量的?——来自LICOR土壤温室气体通量长期监测系统14个月的测量数据...
  7. android 百度移动搜索 url 参数,百度移动搜索开放适配服务的3种方法
  8. [There will be more story......]
  9. 震撼!英伟达用深度学习做图像修复,毫无ps痕迹
  10. 一般一个前端项目完成需要多久_制作分销小程序最快要多久
  11. 华为、中兴嵌入式(C)笔试题
  12. Oracle之rollUp函数
  13. excel计算机一级打不开,excel打不开的原因及解决方法
  14. 【学习记录】SLAM线特征基础:LSD算法、LBD描述子、普朗克坐标、EDLines算法
  15. Python电影数据分析案例
  16. JPA之Specification复杂条件查询
  17. 安装Sublime Text 3插件的方法:
  18. 艾诗菲尔墙布|新品:摩登现代系列《M06-飞马》
  19. 基于vs2019的openGL项目配置
  20. 影响服务器高性能的四大杀手

热门文章

  1. XenDeskTop framework
  2. BZOJ4627 回转寿司 值域线段树
  3. 坛经与禅宗的智慧-王德峰
  4. 【考研初试】复习规划以及推荐资料/老师
  5. 各种Android UI开源框架
  6. 鸟哥的linux私房菜运维篇,鸟哥的Linux私房菜学习笔记之SAMBA
  7. 视频营销(Video Marketing)1-视频营销基础
  8. 分享两道阿里P7究极难度算法题,满满干货指导
  9. 怎样把计算机添加到网络打印机,电脑怎么添加打印机共享
  10. 企业应用大数据的三重境界:数据·分析·成果