WPF组合控件TreeView+DataGrid之DataGrid封装
(关注博主后,在“粉丝专栏”,可免费阅读此文)
wpf的功能非常强大,很多控件都是原生的,但是要使用TreeView+DataGrid的组合,就需要我们自己去封装实现。
我们需要的效果如图所示:


这2个图都是第三方控件自带的,并且都是收费使用。
现在我们就用原生的控件进行封装一个。
本文源码效果截图,(搞了好几天,的确有难度,所以源码也收费,便宜,赚点辛苦费)

功能如上图所示, 目前基本上把常用的样式都实现了
首先说明一下,实现上面的效果,有3种方法
第一种:技术的选择是TreeView。
WPF组合控件TreeView+DataGrid之TreeView封装-CSDN博客
第二种:技术的选择是DataGrid(也就是本文的演示)。
第三种:技术的选择是ListView。
本文演示的是DataGrid的实现。
1.首先建立一个wpf程序

2.封装TreeDataGrid.cs
namespace DataGrid.TreeDataGrid
{using System.Windows;//把引用写在里面using System.Windows.Controls;public class TreeDataGrid : DataGrid{protected override DependencyObject GetContainerForItemOverride(){return new TreeDataGridRow();}protected override bool IsItemItsOwnContainerOverride(object item){return item is TreeDataGridRow;}}public class TreeDataGridRow : DataGridRow{}
}
3.DataGridStyle.xaml
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:DataGrid.TreeDataGrid"><!--DataGrid样式--><Style TargetType="{x:Type local:TreeDataGrid}"><!--网格线颜色--><Setter Property="CanUserResizeColumns" Value="false"/><Setter Property="Background" Value="#FFF7EDAD" /><Setter Property="BorderBrush" Value="#FFF5F7F5" /><Setter Property="HorizontalGridLinesBrush"><Setter.Value><SolidColorBrush Color="#d6c79b"/></Setter.Value></Setter><Setter Property="VerticalGridLinesBrush"><Setter.Value><SolidColorBrush Color="#d6c79b"/></Setter.Value></Setter></Style><!--标题栏样式 DataGridColumnHeader--><Style TargetType="DataGridColumnHeader" ><Setter Property="SnapsToDevicePixels" Value="True" /><Setter Property="MinWidth" Value="0" /><Setter Property="MinHeight" Value="28" /><Setter Property="Foreground" Value="#323433" /><Setter Property="FontSize" Value="14" /><Setter Property="FontWeight" Value="Bold" /><Setter Property="Cursor" Value="Hand" /><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="DataGridColumnHeader"><Border x:Name="BackgroundBorder" BorderThickness="0,1,0,1" BorderBrush="#e6dbba" Width="Auto"><Grid ><Grid.ColumnDefinitions><ColumnDefinition Width="*" /></Grid.ColumnDefinitions><ContentPresenter Margin="0,0,0,0" VerticalAlignment="Center" HorizontalAlignment="Center"/><Path x:Name="SortArrow" Visibility="Collapsed" Data="M0,0 L1,0 0.5,1 z" Stretch="Fill" Grid.Column="2" Width="8" Height="6" Fill="White" Margin="0,0,50,0" VerticalAlignment="Center" RenderTransformOrigin="1,1" /><Rectangle Width="1" Fill="#d6c79b" HorizontalAlignment="Right" Grid.ColumnSpan="1" /></Grid></Border></ControlTemplate></Setter.Value></Setter><Setter Property="Height" Value="25"/></Style><!--行样式触发--><!--背景色改变必须先设置cellStyle 因为cellStyle会覆盖rowStyle样式--><Style TargetType="local:TreeDataGridRow"><Setter Property="Margin" Value="0"/><Setter Property="Padding" Value="0"/><Style.Triggers><DataTrigger Binding="{Binding IsVisible}" Value="False"><Setter Property="Visibility" Value="Collapsed"/></DataTrigger><Trigger Property="AlternationIndex" Value="0" ><Setter Property="Background" Value="#e7e7e7" /></Trigger><Trigger Property="AlternationIndex" Value="1" ><Setter Property="Background" Value="#f2f2f2" /></Trigger><Trigger Property="IsMouseOver" Value="True"><Setter Property="Background" Value="Red"/><!--<Setter Property="Foreground" Value="White"/>--></Trigger><Trigger Property="IsSelected" Value="True"><Setter Property="Background" Value="YellowGreen"/></Trigger></Style.Triggers></Style><!--单元格样式触发--><Style TargetType="DataGridCell"><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="DataGridCell"><TextBlock VerticalAlignment="Center" ><ContentPresenter /></TextBlock></ControlTemplate></Setter.Value></Setter><Style.Triggers><Trigger Property="IsSelected" Value="True"><Setter Property="Foreground" Value="Red"/></Trigger></Style.Triggers></Style>
</ResourceDictionary>
4.最终源码实例

需要源码请联系我。
本文来源:
WPF组合控件TreeView+DataGrid之DataGrid封装-CSDN博客
相关文章:
WPF组合控件TreeView+DataGrid之DataGrid封装
(关注博主后,在“粉丝专栏”,可免费阅读此文) wpf的功能非常强大,很多控件都是原生的,但是要使用TreeViewDataGrid的组合,就需要我们自己去封装实现。 我们需要的效果如图所示&#x…...
PIL/Pillow
Abstract PIL(Python Imaging Library)是一个用于图像处理的 Python 库。它提供了广泛的功能,包括图像加载、保存、调整大小、裁剪、旋转、滤镜应用等。 由于 PIL 的开发停止在 2009 年,因此推荐使用其后续的维护版本 Pillow。Pillow 是一个兼容 PIL 接…...
ARM 汇编入门
ARM 汇编入门 引言 ARM 汇编语言是 ARM 架构的汇编语言,用于直接控制 ARM 处理器。虽然现代软件开发更多地依赖于高级语言和编译器,但理解 ARM 汇编仍然对于深入了解系统、优化代码和进行低级调试非常重要。本文将为您提供一个简单的 ARM 汇编入门指南…...
SQL进阶:多表查询
在SQL基础部分,我们在讲解的过程中只用到了单表查询。但实际上,常见的业务场景单表查询不能满足,或者拆分查询性能过慢。这个时候我们就需要用到连接查询。即查询多表按一定规则合并后的数据。 注意,合并后的数据也是表ÿ…...
多层负载均衡实现
1、单节点负载均衡 1)站点层与浏览器层之间加入了一个反向代理层,利用高性能的nginx来做反向代理 2)nginx将http请求分发给后端多个web-server 优点: 1)DNS-server不需要动 2)负载均衡:通过ngi…...
Redis取最近10条记录
有时候我们有这样的需求,就是取最近10条数据展示,这些数据不需要存数据库,只用于暂时最近的10条,就没必要在用到Mysql类似的数据库,只需要用redis即可,这样既方便也快! 具体取最近10条的方法&a…...
Mybatis之增删改查
目录 一、引言 二、Mybatis——增 举例:添加用户 三、Mybatis——删 举例:删除用户 四、Mybatis——改 举例:修改用户 五、Mybatis——查 六、注意 END: 一、引言 书接上回,我们在了解完mybatis之后,肯…...
Go 代码检查工具 golangci-lint
一、介绍 golangci-lint 是一个代码检查工具的集合,聚集了多种 Go 代码检查工具,如 golint、go vet 等。 优点: 运行速度快可以集成到 vscode、goland 等开发工具中包含了非常多种代码检查器可以集成到 CI 中这是包含的代码检查器列表&…...
SwiftUI 趣谈之:绝不可能(Never)的 View!
概览 SwiftUI 的出现极大的解放了秃头码农们的生产力。SwiftUI 中众多原生和自定义视图对于我们创建精彩撩人的 App 功不可没! 不过,倘若小伙伴们略微留意过 SwiftUI 框架头文件里的源代码,就会发现里面嵌有一些奇怪 Never 类型,…...
etcd是什么
目录 1.关于etcd2.应用场景 本文主要介绍etcd 概念和基本应用场景。 1.关于etcd etcd是一个开源的、分布式的键值存储系统,用于共享配置和服务发现。它是由CoreOS团队开发的,主要用于实现分布式系统的配置管理和服务发现。 etcd的主要特性包括&#x…...
应用全局的UI状态存储AppStorage
目录 1、概述 2、StorageProp 2.1、观察变化和行为表现 3、StorageLink 3.1、观察变化和行为表现 4、从应用逻辑使用AppStorage和LocalStorage 5、从UI内部使用AppStorage和LocalStorage 6、不建议借助StorageLink的双向同步机制实现事件通知 6.1、推荐的事件通知方式…...
MySQL数据库 触发器
目录 触发器概述 语法 案例 触发器概述 触发器是与表有关的数据库对象,指在insert/update/delete之前(BEFORE)或之后(AFTER),触发并执行触发器中定义的soL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性,日志记录&am…...
C语言学习之给定任意的字符串,清除字符串中的空格
实例要求:给定任意的字符串,清除字符串中的空格,并将其输出;实例分析:1、指针函数实现,需要注意指针函数的返回值是一个指针类型;2、字符类型的数组实现,循环遍历并赋给新的数组&…...
由实验数据进行函数拟合的python实现
0.引言 已知公式求参的过程,对工程而言,一般是一个线性拟合或者非线性拟合的过程。我们现在来以代码片段为例,来描述如何求参。一般这个过程会涉及超定方程的计算。这个过程,原本需要使用matlab,现在python照样可以做…...
<JavaEE> 基于 UDP 的 Socket 通信模型
目录 一、认识相关API 1)DatagramSocket 2)DatagramPacket 3)InetSocketAddress 二、UDP数据报套接字通信模型概述 三、回显客户端-服务器通信 1)服务器代码 2)客户端代码 一、认识相关API 1)Data…...
Golang 链表的基础知识
文章目录 链表链表基础知识部分链表的存储方式链表的定义链表的操作性能分析 链表 更多有关于go链表的内容可以见这篇文章链表的创建和读取 链表基础知识部分 什么是链表,链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,…...
webpack 常见面试题
1、什么是webpack(必会) webpack是一个打包模块化javascript的工具,在webpack里一切文件皆模块,通过loader转换文件,通过plugin注入钩子,最后输出由多个模块组合成的文件,webpack专注构建模块化…...
three.js实战模拟VR全景视图
文章中使用到的案例图片都来源于:Humus - Textures 里面有很多免费的资源,可以直接下载,每个资源里面都提供6个不同方位的图片,我们通过threejs稍微处理一下,就能实现以下3D效果的场景了。 <template><div …...
聊聊Spring Boot配置文件:优先级顺序、bootstrap.yml与application.yml区别详解
Spring Boot 配置文件 优先级顺序 在Spring Boot中,配置文件的优先级顺序是:bootstrap.yml > application.yml > application-{profile}.yml,其中 {profile} 表示不同的环境配置,如 dev、test、prod 等。当存在相同名称的…...
Milvus向量数据库基础用法及注意细节
1、Milvus数据类型与python对应的数据类型 Milvus Python DataType.INT64 numpy.int64 DataType.INT32 numpy.int32 DataType.INT16 numpy.int16 DataType.BOOL Boolean DataType.FLOAT numpy.float32 DataType.DOUBLE numpy.double DataType.ARRAY list DataT…...
手把手教你用FastBlur打造高级感UI:从对话框背景到沉浸式音乐播放器的完整实现
用FastBlur打造高级UI的实战指南:从对话框到音乐播放器的设计进化 毛玻璃效果早已从iOS的视觉语言演变为现代移动应用设计的通用元素。这种半透明模糊效果不仅能提升界面层次感,还能在不分散用户注意力的情况下创造视觉焦点。本文将带你深入Android平台实…...
Unity游戏开发实战:用三阶贝塞尔曲线为你的角色设计一条丝滑的移动路径(附完整C#脚本)
Unity游戏开发实战:三阶贝塞尔曲线打造丝滑角色移动路径 想象一下,你的游戏角色需要完成一个优雅的空中翻转动作,或者赛车需要在弯道实现完美漂移轨迹。这些令人惊叹的运动效果背后,往往隐藏着一条看不见的数学曲线——贝塞尔曲线…...
LingBot-Depth实操手册:Gradio API返回JSON结构解析与字段含义
LingBot-Depth实操手册:Gradio API返回JSON结构解析与字段含义 1. 引言:为什么需要了解API返回结构 当你使用LingBot-Depth处理深度图像时,最让人困惑的可能就是API返回的那一串JSON数据。这些数据到底代表什么?每个字段有什么含…...
nomic-embed-text-v2-moe保姆级教程:Gradio自定义CSS主题与响应式布局
nomic-embed-text-v2-moe保姆级教程:Gradio自定义CSS主题与响应式布局 1. 从零开始:认识nomic-embed-text-v2-moe 如果你正在寻找一个既强大又好用的文本嵌入模型,特别是需要处理多语言内容,那么nomic-embed-text-v2-moe绝对值得…...
AnotherRedisDesktopManager:让Redis管理变得简单高效的5个理由
AnotherRedisDesktopManager:让Redis管理变得简单高效的5个理由 【免费下载链接】AnotherRedisDesktopManager qishibo/AnotherRedisDesktopManager: Another Redis Desktop Manager 是一款跨平台的Redis桌面管理工具,提供图形用户界面,支持连…...
谷歌DeepMind与卡内基梅隆大学揭秘声音背后的脸
这项由谷歌DeepMind与卡内基梅隆大学联合开展的研究,发表于2024年的计算机视觉与模式识别顶级会议CVPR(IEEE/CVF Conference on Computer Vision and Pattern Recognition),论文编号为arXiv:2404.01975,有兴趣深入了解…...
Livox_ros_driver vs driver2:消息类型详解与ROS生态兼容性避坑指南
Livox_ros_driver与driver2深度对比:消息架构解析与ROS生态适配实战 当Livox发布HAP等新一代激光雷达时,技术团队常面临驱动版本选择的困境。livox_ros_driver与livox_ros_driver2看似只是版本迭代,实则反映了ROS生态中传感器接口标准化的深层…...
LEDPatternLib:非阻塞LED动画库设计与嵌入式实践
1. 项目概述LEDPatternLib 是一款面向嵌入式 LED 动画控制的轻量级、模块化 Arduino 库,专为资源受限的微控制器平台设计。其核心目标并非替代底层驱动,而是构建在成熟硬件抽象层之上的非阻塞(non-blocking)模式动画调度框架。该库…...
OpenClaw智能书签:用nanobot自动归类收藏网页内容
OpenClaw智能书签:用nanobot自动归类收藏网页内容 1. 为什么需要智能书签 作为一个每天要浏览大量技术文档和行业资讯的开发者,我发现自己陷入了"收藏即学会"的陷阱。Chrome书签栏里堆满了未分类的链接,Notion数据库里散落着零碎…...
MecanumBase:轻量级全向轮运动学逆解C库
1. MecanumBase 库概述MecanumBase 是一个专为全向移动机器人设计的轻量级底层控制库,核心目标是将复杂的轮式运动学解耦为工程师可直观理解的输入指令:平移方向角(θ)与旋转角速度(ω)。该库不依赖任何特定…...
