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博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/264291.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【MAC、IOS】charles抓包配置教程,亲测有效

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

4.3【共享源】克隆实战开发之截屏(一)

一,Screen截屏介绍 Screen的截屏是指从源读取像素,然后复制到缓冲区。然后可以根据需要操纵缓冲区;它可以简单地写入文件,也可以在其他窗口或显示器中使用。 Screen API从源中读取像素,并将其复制到提供的缓冲区中以捕获截屏。缓冲区可以是pixmap或窗口缓冲区,但必须设…

UE5 Landscape 制作GIS卫星图地形

1. 总体想法&#xff1a; 制作GIS地形&#xff0c;使用Landscaping MapBox是一个好方法&#xff0c;但是区域过大&#xff0c;会占用很多内存 https://blog.csdn.net/qq_17523181/article/details/135029614 如果采用QGis&#xff0c;导出卫星图&#xff0c;在UE5里拼合出地形…

趁网站还在!用python把次元岛COS小姐姐图集批量下载~

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 开发环境: Python 3.10 Pycharm 模块使用: requests >>> 数据请求模块 re >>> 匹配提取数据 os >>> 自动创建文件夹 如何安装python第三方模块: win R 输入 cmd 点击确定, 输入安装命令 p…

Codeforces Round 862 (Div. 2)

Problem - A - Codeforces AC代码: #include<bits/stdc.h> #define endl \n //#define int long long using namespace std; const int N1e310; int a[N]; int n; void solve() {cin>>n;int ans0;for(int i1;i<n;i) cin>>a[i],ans^a[i];if(n%21){for(in…

SQL布尔盲注 (Blind)基本原理及使用burpsuite进行暴力猜解

SQL布尔型盲注入是一种SQL注入攻击方式&#xff0c; 根据某个条件是否成立&#xff0c;来判断返回结果的真假&#xff0c;通过布尔型盲注&#xff0c;攻击者可以逐个字符地推断出数据库中存储的信息&#xff0c;如用户名、密码等&#xff0c;从而获取敏感信息或者执行非法操作。…

【EI会议征稿】第三届算法、微芯片与网络应用国际会议(AMNA 2024)

第三届算法、微芯片与网络应用国际会议&#xff08;AMNA 2024&#xff09; 2024 3rd International Conference on Algorithms, Microchips and Network Applications 第三届算法、微芯片与网络应用国际会议(AMNA 2024) 将于2024年3月8-10日在中国西安召开, AMNA 2024将围绕 …

表格实现合并单元格

实现的效果 一、列合并 此需求的列合并比较简单, 直接使用el-table-column包括即可 <el-table-column align"center" sortable label"目标"><el-table-column prop"target1" sortable label"预设目标" /><el-table-c…

设计模式-门面模式

设计模式专栏 模式介绍模式特点应用场景门面模式和代理模式的区别代码示例Java实现门面模式Python实现门面模式 门面模式在spring中的应用 模式介绍 门面模式是一种常用的软件设计模式&#xff0c;也称为外观模式。它提供了一个高层次的接口&#xff0c;将一个子系统的外部与内…

1. 行为模式 - 责任链模式

亦称&#xff1a; 职责链模式、命令链、CoR、Chain of Command、Chain of Responsibility 意图 责任链模式是一种行为设计模式&#xff0c; 允许你将请求沿着处理者链进行发送。 收到请求后&#xff0c; 每个处理者均可对请求进行处理&#xff0c; 或将其传递给链上的下个处理…

SaaS智慧校园云平台源码,智慧班牌系统,家校互联小程序源码

SaaS智慧校园云平台源码&#xff0c;智慧班牌系统&#xff0c;原生小程序 集智慧教学、智慧教务、智慧校务、智慧办公于一体的校园管理平台源码。集成智能硬件及第三方服务&#xff0c;面向学校、教师、家长、学生&#xff0c;将校内外管理、教学等信息资源进行整合&#xff0c…

vue微乾坤子应用开发及ele组件开发时问题记录

一. 微乾坤 1. 新增page页面路由,pmi权限中心配置正常&#xff0c;跳转链接正确&#xff0c;但路由未找到403. 解决&#xff1a; 新增的配置是page类型&#xff0c;transformQianKunRoute方法转换微前端路由数据 时&#xff0c;过滤未兼容page型的路由&#xff0c; 解决 [menu,…

Android开发——添加图片

1、首先选择一张需要的图片&#xff0c;通过左侧的Resource Manage选择“”并选择Import Drawables 选择一张图片 并调整以下两个内容 这两个内容的作用借用谷歌官方的Android开发教程的内容&#xff1a; *Android 设备具有不同的屏幕尺寸&#xff08;手机、平板电脑和电视等…

Histcite下载教程

这个安装就很简单了&#xff0c;可以通过百度网盘下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1WVkXnh3LiJJ08nKqmI5LQw?pwdug9c 提取码&#xff1a;ug9c 解压后&#xff0c;将savedress_for_test.txt放入TXT文件当中 双击main.exe文件&#xff0c;输入1或2…

Kubectl 部署简单应用

创建新服务 kubectl create deployment kubernetes-bootcamp --imagegcr.io/google-samples/kubernetes-bootcamp:v1查看 kubectl get deployments打开新的终端执行 kubectl proxy此时&#xff0c;切回上一个终端&#xff0c;通过 kubectl get pods可查看已部署好的pod。并通…

五种简单保护网站安全的方法看这里!

随着互联网的快速发展&#xff0c;随着品牌效应的加大&#xff0c;企业网站已经成为了企业对外展示的明信片&#xff0c;以及宣传获取私有流量的重要渠道。所以保护企业网站安全至关重要。这里我们就来一起了解一下五种简单保护网站安全的方法&#xff0c;仅供参考哦&#xff0…

【开源工程及源码】超级经典开源项目实景三维数字孪生智慧机场

智慧机场可视化平台通过可视化手段&#xff0c;将复杂的机场运营数据以图形、图表等形式展现&#xff0c;使管理者能够更直观、实时地了解机场的各个方面。飞渡科技通过整合物联网IOT、人工智能、大数据分析等技术&#xff0c;围绕机场管理、运控、安防、服务、监测等业务领域&…

Python模块导入的相关介绍

浅谈python模块的导入操作 1.什么是模块 在Python中有一个概念叫做模块(module)。所谓模块&#xff0c;就是将代码量较大的程序分割成多个有组织的&#xff0c;彼此独立但双能互相交互的代码片段&#xff0c;这些自我包含的有组织的代码段就是模块。 2.模块的特点 python中…

前端真的没有出路了嘛?不,当然不是!一定不是!绝对不是!

hello world&#xff01; 一、为什么会出现“前端已死”的言论 作为一个老前端的老公&#xff0c;我认为前端行业的就业前景非常广阔&#xff0c;而且未来也很有潜力。 我认为前端行业的就业前景非常广阔&#xff0c;而且未来也很有潜力。 有些人却唱衰前端这个行业。我觉得这…

两种方法解决win10开机慢,经验分享

方法一&#xff1a; 1、按快捷键“winR”打开 运行窗口。 2、这时候输入“msconfig”后 &#xff0c;点击“确定”或者按“ENTER”键。 3、这时候会打开一个名为“系统配置”的窗口&#xff0c; 在“常规”选项框下 勾选“有选择的启动”下的“加载系统服务”和“加载启动项”。…