当前位置: 首页 > news >正文

WPF学习笔记(16)树控件TreeView与数据模板

树控件TreeView与数据模板

  • 一、TreeView
    • 1. TreeView概述
    • 2. TreeViewItem概述
    • 3. ItemsControl类
    • 4. HeaderedItemsControl类
    • 5. TreeView类
    • 5. TreeViewItem类
    • 6. 实例
  • 二、数据模板
    • 1.DataTemplate示例
    • 2. HierarchicalDataTemplate示例
  • 总结


一、TreeView

1. TreeView概述

TreeView在树结构(其中的项可以展开和折叠)中显示分层数据。。
官方文档:https://learn.microsoft.com/zh-cn/dotnet/api/system.windows.controls.treeview?view=netframework-4.8
在这里插入图片描述

2. TreeViewItem概述

TreeViewItem类代表一个在树控件中可以选择的项。
官方文档:https://learn.microsoft.com/zh-cn/dotnet/api/system.windows.controls.treeviewitem?view=netframework-4.8
在这里插入图片描述

3. ItemsControl类

ItemsControl类是列表ListBox、下拉框ComboBox、菜单、表格等一系列选项的基类,部分属性如下:
|属性|说 明|

左对齐
ltemsSource获取或设置用于生成 ltemsControl 的内容的集合。
设置ltemsSource属性后,集合ltems是只读且固定大小的,因此不可修改。
ltems获取用于生成 ltemsControl 的内容的集合。
DisplayMemberPath获取或设置源对象上的值的路径,以用作对象的可视表示形式,不能同时设置 DisplayMemberPath 和ltemTemplate.
ItemTemplate获取或设置用来显示每个项的数据模板DataTemplate。
ltemContainerStyle获取或设置应用于为每个项生成的容器元素的 Style。

4. HeaderedItemsControl类

HeaderedItemsControl类的部分属性如下:

属性说 明
Header获取或设置控件 标题。可以是一个字符串或 UIElement。
Object类型
HeaderStringFormat获取或设置一个撰写字符串,该字符串指定如果 Header属性显示为字符串,应如何设置该属性的格式。
HeaderTemplate获取或设置用于显示控件标题 的 数据模板
(DataTemplate 类型)
HeaderTemplateSelector获取或设置一个对象,该对象为用来显示每个项的标题的模板提供自定义选择逻辑。

5. TreeView类

TreeView类的部分属性和事件如下:

属性说 明
Selectedltem获取 TreeView 中的选定项,如果选择为空返回 null。
SelectedValue获取或设置当前选定项的某个属性值。
SelectedValuePath通常与"SelectedValue"属性一起使用,用于指定控件中选定项目的属性。
事件说 明
SelectedltemChanged当选择项更改时发生。

5. TreeViewItem类

TreeViewItem类的部分属性和事件如下:

属性说 明
IsExpanded获取或设置是否展开节点
IsSelected获取或设置是否选中节点
IsSelectionActive获取是否具有键盘焦点。
事件说 明
Collapsed当收拢节点时触发
Expanded当展开节点时触发
Selected选中节点时触发(选子节点时,也会向上传递触发父节点的)
Unselected未选中节点时触发

6. 实例

在这里插入图片描述

  • 子项会放到Items集合里面
  • Header是Object类型可以是文字或元素
    代码和运行结果如下所示:
    <Grid><TreeView x:Name="treeView" Margin="155,98,178,80"><TreeViewItem Header="张三老师" IsExpanded="True" Selected="TreeViewItem_Selected" ><TreeViewItem Header="数学" Selected="TreeViewItem_Selected"><!--子项会放到Items集合里面--><TreeViewItem Header="线性代数" Selected="TreeViewItem_Selected"/><TreeViewItem Header="数率统计"/></TreeViewItem><TreeViewItem Header="体育"/></TreeViewItem><TreeViewItem Header="李四老师"><TreeViewItem ><!--Header是Object类型可以是文字或元素--><TreeViewItem.Header><Grid><Rectangle Height="20" Width="80" Fill="Red"/><TextBlock Text="音乐" Foreground="Blue"/></Grid></TreeViewItem.Header></TreeViewItem></TreeViewItem></TreeView></Grid>

在这里插入图片描述

在MainWindow.xaml.cs文件中编写事件代码

private void TreeViewItem_Selected(object sender, RoutedEventArgs e)
{Console.WriteLine("触发 " + sender + " Selected");//避免向上触发多次e.Handled = true;
}private void treeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{//treeView.SelectedValuePath = "Header" 可以观测 SelectedValue 的区别Console.WriteLine("选择的是" + treeView.SelectedItem + "->" + treeView.SelectedValue );
}

二、数据模板

1.DataTemplate示例

真实业务中,数据对象往往比较复杂,含有多个字段信息。下面以带图标的树节点为例

    public class TreeNode{//名称public string Name { get; set; }//节点图标public string Image { get; set; }//子节点集合public List<TreeNode> Children { get; set; }}

定义数据源

List<TreeNode> list = new List<TreeNode>();
TreeNode n1 = new TreeNode
{Name = "张三",Image = "/Images/plane.png",Children = new List<TreeNode>()
};
TreeNode n2 = new TreeNode
{Name = "李四",Image = "/Images/plane.png"
};TreeNode n11 = new TreeNode
{Name = "C++",Image = "/lmages/ball.jpg",Children = new List<TreeNode>()
};
TreeNode n12 = new TreeNode
{Name = "JAVA",Image = "/Images/ball.jpg"
};TreeNode n111 = new TreeNode
{Name = "基础",Image = "/Images/cat.bmp"
};
TreeNode n112 = new TreeNode
{Name = "高级",Image = "/Images/cat.bmp",
};n1.Children.Add(n11);
n1.Children.Add(n12);n11.Children.Add(n111);
n11.Children.Add(n112);list.Add(n1);
list.Add(n2);
treeView.itemsSource = list;
treeView.SelectedValuePath = "Name";

利用DataTemplate实现

<Grid><TreeView x:Name="treeView" Margin="155,98,178,80" SelectedItemChanged="treeView_SelectedItemChanged"><TreeView.ItemTemplate><DataTemplate><StackPanel Orientation="Horizontal"><Image Source="{Binding Image}" Width="16" Height="16" Margin="0,0,5,0" /><TextBlock Text="{Binding Name}" /></StackPanel></DataTemplate></TreeView.ItemTemplate></TreeView>
</Grid>

在这里插入图片描述

2. HierarchicalDataTemplate示例

表示支持 HeaderedltemsControl的DataTemplate,可继承并递归展示子节点,例如 TreeViewltemMenultem在这里插入图片描述
在这里插入图片描述

<TreeView x:Name="treeView" Margin="155,98,178,80" SelectedItemChanged="treeView_SelectedItemChanged"><TreeView.ItemTemplate><HierarchicalDataTemplate ItemsSource="{Binding Children}"><StackPanel Orientation="Horizontal"><Image Source="{Binding Image}" Width="16" Height="16" Margin="0,0,5,0" /><TextBlock Text="{Binding Name}" /></StackPanel></HierarchicalDataTemplate></TreeView.ItemTemplate>
</TreeView>

定义事件

        private void treeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e){TreeNode n = treeView.SelectedItem as TreeNode;Console.WriteLine(n.Name + ',' + n.Image);}

运行结果
HierarchicalDataTemplate

总结

  • HierarchicalDataTemplate可以继承并递归展示子节点
http://www.dtcms.com/a/266162.html

相关文章:

  • WPF学习笔记(22)项面板模板ltemsPanelTemplate与三种模板总结
  • spring-ai-alibaba 1.0.0.2 学习(八)——接入阿里云信息查询服务
  • 深度学习-逻辑回归
  • RJ45 连接器(水晶头)的引脚定义
  • 从0到1解锁Element-Plus组件二次封装El-Dialog动态调用
  • Gemini CLI初体验
  • 二叉树题解——二叉树的层序遍历【LeetCode】队列实现
  • Java中Stream流的使用
  • Web攻防-文件上传黑白名单MIMEJS前端执行权限编码解析OSS存储分域名应用场景
  • 设计模式(九)
  • 魔术方法__call__
  • Redis缓存架构实战
  • Selenium Base全新升级版:新一代自动化框架实战解析
  • Python 的内置函数 range
  • 高边驱动 低边驱动
  • 黑暗中的爆破(船讯网Ais爬虫暨爬虫实战js逆向学习经验分享)
  • 车载以太网-IP 掩码 vlan 端口
  • SciPy 安装使用教程
  • [特殊字符] 电子机械制动(EMB)产业全景分析:从技术演进到千亿市场爆发
  • 高通QCS8550部署YOLO-NAS模型与性能测试
  • 使用excel中的MATCH函数进行匹配数据
  • Python数据库软件:查询与预测功能集成系统
  • Linux常见指令以及权限理解
  • 使用 Flask 构建基于 Dify 的企业资金投向与客户分类评估系统
  • HTTP详细介绍
  • Windows 10 2016 长期服务版
  • 仿小红书交流社区(微服务架构)
  • day 58 python打卡
  • AppInventor2 标签内容过多,如何做到可上下滑动?
  • 【WRFDA教程第一期】运行观测预处理程序(OBSPROC)