一:静态使用
1.TreeView控件介绍
TreeView简介 :父类:ItemsControl —条目控件 MenuItem:HeaderedItemsControl
按层次结构组织数据 TreeViewItem —HeaderedItemsControl
属性介绍
SelectedItem 选择的项 SelectedValue 选择项的值.
SelectedValuePath (string) 菜单名称 编号(列名或属性名)
ItemsSource 数据源
TreeViewItem介绍
TreeViewItem —HeaderedItemsControl
ItemsSource IsExpanded true 展开 false(默认) 折叠
IsSelected 是否选择
2.具体案例
<Window x:Class="WpfAppTest.TreeViewWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:WpfAppTest"mc:Ignorable="d"Title="TreeViewWindow" Height="450" Width="800"><Window.Resources><Style TargetType="TreeViewItem"><Setter Property="Foreground" Value="Orange"/><Setter Property="FontSize" Value="14"/><Setter Property="Padding" Value="10"/><Setter Property="Background" Value="Transparent"/></Style></Window.Resources><Grid><TreeView Name="tvLsit" HorizontalAlignment="Left" Height="292" Margin="31,25,0,0" VerticalAlignment="Top" Width="330" SelectedItemChanged="TvLsit_SelectedItemChanged"><TreeViewItem Header="学生管理系统" IsExpanded="True" ><TreeViewItem Header="系统管理" IsExpanded="True"><TreeViewItem Header="角色管理" IsSelected="True" Foreground="LightBlue" /><TreeViewItem Header="用户管理"/><TreeViewItem Header="菜单管理"/><TreeViewItem Header="权限管理"/></TreeViewItem><TreeViewItem Header="业务管理" IsExpanded="False"><TreeViewItem Header="采购入库"/><TreeViewItem Header="销售出库"/></TreeViewItem></TreeViewItem></TreeView></Grid></Window>
/// <summary>/// 节点选择响应事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void TvLsit_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e){var val = e.NewValue as TreeViewItem;MessageBox.Show(val.Header.ToString());}
二:动态使用
1.TreeView控件介绍
代码创建节点:可后台代码添加节点,并不比xaml代码简洁
多层次数据,构造出来:数据库表、Xml文档、Excel数据
编号 名称 父节点编号
1 进销存系统 0
2 系统管理 1
3 用户管理 2
动态生成节点树—分层数据模板
DataType 数据模型
ItemsSource 下一级别的数据列表
2.具体案例
<Window x:Class="WpfAppTest.TreeViewWindow2"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:WpfAppTest"xmlns:model="clr-namespace:WpfAppTest.Models"mc:Ignorable="d"Title="TreeViewWindow2" Height="450" Width="800" Loaded="Window_Loaded"><Grid><TreeView Name="tvList" HorizontalAlignment="Left" Height="210" Margin="55,78,0,0" VerticalAlignment="Top" Width="283" ItemsSource="{Binding MenuList}" SelectedItemChanged="TvList_SelectedItemChanged"><TreeView.ItemTemplate><HierarchicalDataTemplate DataType="{x:Type model:MenuItemModel}" ItemsSource="{Binding SubItems}"><TextBlock Text="{Binding MenuName}" VerticalAlignment="Center" /></HierarchicalDataTemplate></TreeView.ItemTemplate></TreeView></Grid></Window>
namespace WpfAppTest{/// <summary>/// TreeViewWindow2.xaml 的交互逻辑/// </summary>public partial class TreeViewWindow2 : Window{public TreeViewWindow2(){InitializeComponent();}private void Window_Loaded(object sender, RoutedEventArgs e){//代码添加节点---并不比xaml代码简洁{//TreeViewItem ti = new TreeViewItem();//ti.Header = "进销存管理系统";//tvList.Items.Add(ti);根节点下添加三个子节点//TreeViewItem ti1 = new TreeViewItem();//ti1.Header = "系统管理";//ti.Items.Add(ti1);//TreeViewItem ti2 = new TreeViewItem();//ti2.Header = "业务管理";//ti.Items.Add(ti2);//TreeViewItem ti3 = new TreeViewItem();//ti3.Header = "查询中心";//ti.Items.Add(ti3);系统管理节点下添加4个子节点//TreeViewItem ti11 = new TreeViewItem();//ti11.Header = "用户管理";//ti1.Items.Add(ti11);//TreeViewItem ti12 = new TreeViewItem();//ti12.Header = "角色管理";//ti1.Items.Add(ti12);//TreeViewItem ti13 = new TreeViewItem();//ti13.Header = "菜单管理";//ti1.Items.Add(ti13);//TreeViewItem ti14 = new TreeViewItem();//ti14.Header = "权限管理";//ti1.Items.Add(ti14);}{List<MenuInfo> allMenus = GetMenuList();//基础菜单数据List<MenuItemModel> menuList = new List<MenuItemModel>();//目标菜单数据AddAllMenus(allMenus, menuList, null, 0);VMenuModel vmodel = new VMenuModel();vmodel.MenuList = menuList;this.DataContext = vmodel;//当前Window的数据上下文}}/// <summary>/// 递归加载菜单项数据/// </summary>/// <param name="allMenus"></param>/// <param name="menusList"></param>/// <param name="pMenu"></param>/// <param name="parentId"></param>private void AddAllMenus(List<MenuInfo> allMenus, List<MenuItemModel> menusList, MenuItemModel pMenu, int parentId){var subList = allMenus.Where(m => m.ParentId == parentId);foreach (var mi in subList){MenuItemModel miInfo = new MenuItemModel();miInfo.MenuId = mi.MenuId;miInfo.MenuName = mi.MenuName;if (pMenu != null)pMenu.SubItems.Add(miInfo);elsemenusList.Add(miInfo);AddAllMenus(allMenus, menusList, miInfo, mi.MenuId);}}/// <summary>/// 获取菜单数据/// </summary>/// <returns></returns>private List<MenuInfo> GetMenuList(){string sql = "select MenuId,MenuName,ParentId from MenuInfos";SqlDataReader dr = SqlHelper.ExecuteReader(sql, 1);List<MenuInfo> list = new List<MenuInfo>();while (dr.Read()){MenuInfo menu = new MenuInfo();menu.MenuId = (int)dr["MenuId"];menu.MenuName = dr["MenuName"].ToString();menu.ParentId = (int)dr["ParentId"];list.Add(menu);}dr.Close();return list;}private void TvList_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e){//响应操作var val = e.NewValue as MenuItemModel;//MessageBox.Show(val.MenuName);}}}public class VMenuModel{/// <summary>/// Menu控件的数据源属性/// </summary>public List<MenuItemModel> MenuList { get; set; }}public class MenuInfo{public int MenuId { get; set; }public string MenuName { get; set; }public int ParentId { get; set; }public string MKey { get; set; }}