DataGrid 自定义DataGridColumnheader

WPF DataGrid内联过滤实现攻略 自定义DataGridColumnHeader模板是实现WPF DataGrid内联过滤的关键步骤之一。通过精确的模板设计,可以将过滤逻辑以直观的方式嵌入到网格列头中,提供给用户便捷的交互体验。本章节将深入探讨模板设计原理,以及如何通过实现特定的视觉效果,增强用户的操作感知。在WPF中,控件模板(ControlTemplate)是定义控件外观和行为的蓝图。通过使用模板,我们可以控制控件的每一个可视和交互细节,从而实现完全自定义的用户体验。 阅读详情

在学习DataGrid的过程中,发现自定义DataGridColumnheader 会非常必要,而且可以自定以column 模板。

本例子主要是自定义了Column Header, 自定义Column 内容显示,可以对Column Header的排序和通过拖动header修改column的宽度.

1. 在xml 中添加如下资源

a. 带有箭头的datatemplate, 为用户点Header排序的时候可以显示不同的箭头

向上的箭头data template:                         

            <DataTemplate x:Key="ColumHeaderArrowUp">
                <DockPanel>
                    <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="{Binding}"></TextBlock>
                    <Path x:Name="PT" Stroke="Gray" Fill="SeaGreen" RenderTransformOrigin="0.5,.5">
                        <Path.RenderTransform>
                            <RotateTransform x:Name="RT" Angle="0"></RotateTransform>
                        </Path.RenderTransform>
                        <Path.Data>
                            <PathGeometry>
                                <PathFigure StartPoint="3.5,3">
                                    <LineSegment Point="0,9"></LineSegment>
                                    <LineSegment Point="7,9"></LineSegment>
                                    <LineSegment Point="3.5,3"></LineSegment>
                                </PathFigure>
                            </PathGeometry>
                        </Path.Data>
                    </Path>
                </DockPanel>
            </DataTemplate>
      向下的箭头 data template:

            <DataTemplate x:Key="ColumHeaderArrowDown">
                <DockPanel>
                    <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="{Binding}"></TextBlock>
                    <Path x:Name="PT" Stroke="Gray" Fill="SeaGreen" RenderTransformOrigin="0.5,0.5">
                        <Path.RenderTransform>
                            <RotateTransform x:Name="RT" Angle="180"></RotateTransform>
                        </Path.RenderTransform>
                        <Path.Data>
                            <PathGeometry>
                                <PathFigure StartPoint="3.5,3">
                                    <LineSegment Point="0,9"></LineSegment>
                                    <LineSegment Point="7,9"></LineSegment>
                                    <LineSegment Point="3.5,3"></LineSegment>
                                </PathFigure>
                            </PathGeometry>
                        </Path.Data>
                    </Path>
                </DockPanel>
            </DataTemplate>

b. 添加数据资源

                  首先为XML增加如下namespace:

             xmlns:Local="clr-namespace:ImageVideoPlayer"
             xmlns:sys="clr-namespace:System;assembly=mscorlib"
             xmlns:sysModel="clr-namespace:System.ComponentModel;assembly=System"

                  增加性别资源, 需要在.cs文件中增加类   public class GenderCollection:ObservableCollection<string>{}

            <Local:GenderCollection x:Key="gendercollection">
                <sys:String>Man</sys:String>
                <sys:String>Female</sys:String>
            </Local:GenderCollection>
  增加employee 信息, 在.cs文件中增加类    public class EmployeeCollection : ObservableCollection<Employee>{}

            <Local:EmployeeCollection x:Key="employeecollection">
                <Local:Employee FirstName="A1" LastName="Micheal" bValid="True" Gender="Man" Number="1"></Local:Employee>
                <Local:Employee FirstName="A2" LastName="Micheal" bValid="True" Gender="Man" Number="2"></Local:Employee>
                <Local:Employee FirstName="A3" LastName="Micheal" bValid="True" Gender="Female" Number="3"></Local:Employee>
                <Local:Employee FirstName="A4" LastName="Micheal" bValid="True" Gender="Female" Number="4"></Local:Employee>
            </Local:EmployeeCollection>
                   

c.添加header的style

            <Style TargetType="DataGridColumnHeader" BasedOn="{StaticResource {x:Type DataGridColumnHeader}}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate>
                            <Button Height="auto" Content="{Binding}" x:Name="Btn" Width="auto" Click="Btn_Click" MouseEnter="Btn_MouseEnter" MouseLeave="Btn_MouseLeave" MouseMove="Btn_MouseMove" PreviewMouseDown="Btn_PreviewMouseDown">
                            </Button>
                            <ControlTemplate.Triggers>
                                <Trigger Property="DataGridColumnHeader.SortDirection" Value="0">
                                    <Setter Property="Button.ContentTemplate" TargetName="Btn" Value="{DynamicResource ColumHeaderArrowUp}"></Setter>
                                </Trigger>
                                <Trigger Property="DataGridColumnHeader.SortDirection" Value="1">
                                    <Setter Property="Button.ContentTemplate" TargetName="Btn" Value="{DynamicResource ColumHeaderArrowDown}"></Setter>
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
                <EventSetter Event="Click" Handler="HeaderClickRoutedEventHandler"></EventSetter>
                <EventSetter Event="DragOver" Handler="HeaderDragOverEventHandler"></EventSetter>
                <EventSetter Event="Drop" Handler="HeaderDragDropEventHandler"></EventSetter>
                <EventSetter Event="PreviewMouseLeftButtonDown" Handler="HeaderMouseButtonEventHandler"></EventSetter>
            </Style>

d. 添加DataGrid

        <DataGrid x:Name="EmployeeGrid" HorizontalAlignment="Left" Margin="0" VerticalAlignment="Top" ItemsSource="{StaticResource employeecollection}" AutoGenerateColumns="False" AlternationCount="2"
                  MinColumnWidth="20" CanUserAddRows="False" CanUserResizeRows="False" CanUserSortColumns="True" SelectionUnit="FullRow" AllowDrop="True" SelectionMode="Single" CanUserReorderColumns="True" RowDetailsVisibilityMode="VisibleWhenSelected">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Number" Binding="{Binding Number}"></DataGridTextColumn>
                <DataGridTextColumn Header="First Name" Binding="{Binding FirstName}"></DataGridTextColumn>
                <DataGridTextColumn Header="Last Name" Binding="{Binding LastName}"></DataGridTextColumn>
                <DataGridTemplateColumn Header="Gender" SortMemberPath="{Binding Gender}">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <StackPanel>
                                <TextBlock Text="{Binding Gender}"></TextBlock>
                            </StackPanel>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                    <DataGridTemplateColumn.CellEditingTemplate>
                        <DataTemplate>
                            <StackPanel>
                                <ComboBox ItemsSource="{StaticResource gendercollection}" SelectedItem="{Binding Gender}"></ComboBox>
                            </StackPanel>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellEditingTemplate>
                </DataGridTemplateColumn>
                <DataGridCheckBoxColumn Header="Valid" Binding="{Binding bValid}">
                </DataGridCheckBoxColumn>
            </DataGrid.Columns>
        </DataGrid>

2. 在.cs文件中内容

using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace ImageVideoPlayer
{
    /// <summary>
    /// Interaction logic for GridDragDropManual.xaml
    /// </summary>
    public partial class GridDragDropManual : UserControl
    {
        public GridDragDropManual()
        {
            InitializeComponent();
        }
        #region helper
        public void SortColumn(string header, bool bAescending)
        {
            var employees = this.grid.Resources["employeecollection"] as EmployeeCollection;
            var tempList = new List<Employee>();
            tempList.AddRange(employees);
            tempList.Sort((x, y) =>
            {
                var tempX = x;
                var tempY = y;
                if(bAescending)
                {
                    tempX = y;
                    tempY = x;
                }
                if (header.Contains("First"))
                    return tempX.FirstName.CompareTo(tempY.FirstName);
                else if (header.Contains("Last"))
                    return tempX.LastName.CompareTo(tempY.LastName);
                else if (header.Contains("Number"))
                    return tempX.Number.CompareTo(tempY.Number);
                else if (header.Contains("Gender"))
                    return tempX.Gender.CompareTo(tempY.Gender);
                else if(header.Contains("Valid"))
                    return tempX.bValid.CompareTo(tempY.bValid);
                return 0;
            });
            employees.Clear();
            foreach(var tmp in tempList)
            {
                employees.Add(tmp);
            }
        }
        void ClearSort()
        {
            foreach (var clm in this.EmployeeGrid.Columns)
            {
                //clm.HeaderTemplate = null;
                clm.SortDirection = null;
            }
        }
        #endregion
        #region event
        public static readonly DependencyProperty DPbUp = DependencyProperty.Register("bUp", typeof(bool), typeof(GridDragDropManual));
        bool _bUp = true;
        bool bUp 
        { 
            get { return (bool)GetValue(DPbUp); } 
            set { SetValue(DPbUp,value); } 
        }
        bool bColumnResize = false;
        int ResizeIndex;
        void HeaderClickRoutedEventHandler(object sender, System.Windows.RoutedEventArgs e)
        {
            if (bColumnResize) return;
            var header = sender as DataGridColumnHeader;
            if (header == null) return;            
            SortColumn(header.Content as string, bUp);
            bUp = !bUp;
            _bUp = bUp;
            ClearSort();
            header.Column.SortDirection = bUp ? ListSortDirection.Ascending : ListSortDirection.Descending;
            this.EmployeeGrid.CurrentColumn = header.Column;
        }

        private void HeaderDragOverEventHandler(object sender, System.Windows.DragEventArgs e)
        {

        }

        private void HeaderDragDropEventHandler(object sender, System.Windows.DragEventArgs e)
        {

        }
        
        private void HeaderMouseButtonEventHandler(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {

        }
        #endregion

        private void Btn_Click(object sender, RoutedEventArgs e)
        {

        }

        private void Btn_MouseEnter(object sender, MouseEventArgs e)
        {

        }
        
        private void Btn_MouseLeave(object sender, MouseEventArgs e)
        {
            if (bColumnResize)
            {
                Cursor = Cursors.Arrow;
                bColumnResize = false;
            }
        }
        Point oldPos;
        private void Btn_MouseMove(object sender, MouseEventArgs e)
        {
            var btn = sender as Button;
            if (btn == null) return;
            var pos = e.GetPosition(btn);
            var rect = VisualTreeHelper.GetDescendantBounds(btn);
            var parent = VisualTreeHelper.GetParent(btn);
            while(parent != null)
            {
                if(parent is DataGridColumnHeader)
                {
                    break;
                }
                parent = VisualTreeHelper.GetParent(parent);
            }
            if(parent == null)
                return;
            var header = parent as DataGridColumnHeader;            
            if (e.LeftButton == MouseButtonState.Pressed)
            {
                if (bColumnResize && header.Column.DisplayIndex == ResizeIndex)
                {
                    header.Column.Width = new DataGridLength(header.Column.ActualWidth + pos.X - oldPos.X);
                    oldPos = pos;
                }
                else
                    bColumnResize = false;
            }
            else
            {
                oldPos = pos;
                rect.Inflate(0, -3);
                bool bDragArea = false;
                if (rect.Contains(pos))
                {
                    if ((rect.Right - pos.X) < 10)
                    {
                        bDragArea = true;
                    }
                }
                if (bDragArea)
                {
                    Cursor = Cursors.SizeWE;
                    if (!bColumnResize)
                    {
                        bColumnResize = true;
                        ResizeIndex = header.Column.DisplayIndex;
                    }
                }
                else
                    bColumnResize = false;
            }
            if (!bColumnResize)
            {
                Cursor = Cursors.Arrow;
                ResizeIndex = -1;
            }
        }

        private void Btn_PreviewMouseDown(object sender, MouseButtonEventArgs e)
        {
            if (bColumnResize)
                e.Handled = true;
            if(bColumnResize)
            {
                var btn = sender as Button;
                oldPos = e.GetPosition(btn);
            }
        }
    }


    public class GenderCollection:ObservableCollection<string>
    {

    }
    public class EmployeeCollection : ObservableCollection<Employee>
    {

    }
    public class Employee
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int Number { get; set; }
        public string Gender { get; set; }
        public bool bValid { get; set; }
        public Employee()
        {
            bValid = true;
            Gender = "Man";
        }
    }





      



WPF DataGrid自定义样式深度指南:模板、触发器与MVVM实践 桌面应用开发中,数据表格是信息展示的核心组件。WPF DataGrid功能强大,但默认样式往往难以满足工业控制、管理系统等场景对信息密度与操作手感的要求。要深度定制,必须先理解其模板层级与可视化树结构,掌握ControlTemplate、DataGridCell/Row/Header的样式作用域,以及触发器(Trigger)对选中态、悬停态的控制逻辑。结合MVVM模式,还能优雅地处理拖拽排序与动态列绑定。通过局部替换模板而非全盘重写的思路,配合资源字典统一管理,即可在保持滚动虚拟化性能的同时,打造高度贴合产 阅读详情

相关推荐

MulHeardGridview.zip C#Gridview多行表头控件

C#Gridview多行表头控件,参考: https://blog.youkuaiyun.com/xjzdr/article/details/115414497

【WPF】DataGrid多表头的样式设计

需求 在使用WPF开发时,使用DataGrid列表显示数据时,有些字段可以进行分组显示,用于更好的表达它们之间存在的某种关系,因此就考虑到要对DataGrid的表头进行扩展,可以显示多行表头,让这些有关联的字段内容显示的更加明了简洁。 自定义样式 这段自定义样式可以放在MainWindow.xaml文件中,或者自己定义一个存放样式文件的xaml进行存放。 这里在模版里面使用的第一个Grid,是用于总的显示,还有右侧边竖线分割线,嵌入的Grid用于显示多表头的处理显示功能:第一行为总的信息,第二行为第一行和

芝麻麻雀-Asp.Net学习之路 2176

银河麒麟服务器操作系统V10SP3 U盘安装中“基础软件仓库错误”的排查与修复指南

本文针对在无网络环境下使用U盘安装银河麒麟服务器操作系统V10SP3时,遇到的“基础软件仓库错误”问题,提供了详细的排查与修复指南。核心解决方案是通过进入救援模式,使用lsblk命令确定U盘实际设备路径,并在系统引导时手动添加inst.repo内核参数来指定安装源,从而绕过安装程序的自动探测故障,确保安装流程顺利进行。

ik67890123的博客 1193

WPF中, DataGrid表格设置标题Header文字大小和行高

记录DataGrid当中设置标题文字大小和行高的方法

m0_50214533的博客 6495

restbed编译笔记

Restbed 可以构建出基于asio库的restfulAPI服务,Restbed 4.7版本使用了1.12.0版本的asio(其他版本编译不通过),可直接访问github下载:https://github.com/chriskohlhoff/asio/tree/asio-1-12-0。另外Restbed还依赖openssl库(可直接下载exe的安装包,安装后取出lib库及头文件放到到restbed\dependency\openssl中即可,https://slproweb.com/download/W.

mahong100的博客 2106

【数学建模】 进化计算与群体智能

遗传算法(GA)是一种用于优化和搜索问题的启发式算法。它模拟了自然选择的过程,其中个体通过遗传和变异进行繁殖,逐渐进化出更优的解。基本步骤初始化:生成初始种群。适应度评估:评估种群中每个个体的适应度。选择:根据适应度选择个体进行繁殖。交叉:选定个体对进行基因交换,生成新的后代。变异:对一些个体进行基因变异,以增加多样性。迭代:重复评估和繁殖过程,直至达到停止条件。粒子群优化算法(PSO)是一种基于群体智能的优化算法,由Kennedy和Eberhart于1995年提出。其灵感来源于鸟群觅食的行为。

weixin_42914989的博客 1113

WPF的DataGrid设置标题头

上述示例中,BorderThickness属性设置为"0,0,0,2"表示只显示底部的分割线,厚度为2个像素;在给定的代码中,列头的内容将水平居中对齐,背景和前景颜色分别为白色和黑色,边框厚度为 1 像素,边框颜色为浅灰色。要设置DataGrid标题头的分割线、背景色和前景色等属性,您可以使用DataGrid的样式和模板来自定义标题头的外观。上述示例中,Foreground属性设置为"#FFFFFF"表示标题头的前景色(文字颜色)为白色。:设置列头的前景颜色(文字颜色)为黑色 (#000000)。

ultramand的博客,重生之我在cad上二次开发猛猛敲C#代码~ 3416

Vofa+使用笔记(1):用Vofa+通过串口连接显示波形

1. 介绍 Vofa+有三种协议设置 rawdata:你发什么就显示什么,跟普通的串口助手一样 firewater:最简单在VOFA+里绘制波形的协议,建议仅在通道数量不多、发送频率不高的时候使用。 justfloat:有一定的数据格式,此协议非常适合用在通道数量多、发送频率高的时候。 2. 使用步骤 设置号下面三个地方,使用的协议以及传输的方式 拉出控件 (最开始上位机没有识别到你的数据的时候,右边是没有数据显示的,如果你想要y轴显示什么数据,右边设置显示也可以,右键波形图然后Y轴设置也行) 把进

苏释州的博客 5万+

WPF DataGrid 触发器

<DataGrid.RowHeaderStyle> <Style TargetType="DataGridRowHeader"> <Style.Triggers> <DataTrigger Binding="{Binding Type}" Value="1"> <Setter Property="Background" Value="DeepSkyBlue"><

L.的博客 1036

Oracle到金仓数据库信创改造迁移实施规划方案

**性能测试和优化**:对金仓数据库的性能进行测试,根据业务负载情况进行必要的调优,确保系统能够稳定高效运行。- **数据兼容性**:评估Oracle数据库中的数据结构和金仓数据库的兼容性,明确需要重构的数据模型。- **性能测试**:通过对金仓数据库的性能测试,预估在实际业务环境下的表现,是否能达到业务需求。- **工具选择**:选择适合的迁移工具,如金仓数据库提供的迁移工具,能够提升迁移效率和准确性。- **全面迁移**:在初步迁移成功后,进行全面数据迁移,确保所有数据完整迁移到金仓数据库上。

hdrhdrjdididrr的博客 480

ASPP - 空洞空间金字塔池化

文章目录1 空洞卷积1.1 空洞卷积的理解1.1.1 一维1.1.2 二维1.2 空洞卷积的优劣2. ASPP3. 代码 1 空洞卷积 1.1 空洞卷积的理解 1.1.1 一维 (a) 正常卷积:输入特征 Input feature,kernel = 3,stride = 1,pad = 1,输出特征 Output feature。 (b) 空洞卷积:与图 (a) 不同之处在于 pad = 2,同时引入一个 rate = 2(表示卷积核中参数间间隔的超参)。   还可通过下图进一步理解普通卷积与空洞卷

晓野豬 2万+

wpf中为DataGrid添加checkbox支持多选全选

项目中用到DataGrid, 需要在第一列添加checkbox, 可以多选、全选。 其中涉及的概念DataTemplate, DataGridCellStyle, DataGridCellControlTemplate,Binding, OnPropertyChanged等。 有下面是实现思路: 1.继承INotifyPropertyChanged接口,实现OnPropert

muzizongheng的专栏 1万+

「转载」vaptcha 等手势验证码图像识别与轨迹提取(思路)

作者:文安哲 从博客重开以后就说要更文章,鸽了蛮久了,赶紧补上一篇嫖嫖各位老公的流量。 最近看群里面大家讨论研究手势验证码比较多,然后我也顺带研究做了一下,给各位老公们分享一下做的过程。 首先,一起来康康手势验证码长啥样! 大概就是长这个样子,需要按照图像中的那条轨迹再图片上滑动,不得不说这类验证码确实体验感拉满,让人很想立马关掉这个网站。 那么言归正传,这类验证码该怎么做识...

AI悦创·编程私教1v1 3596

WPF 基础控件之 DataGrid 样式

此群已满340500857,请加新群458041663 由于微信群人数太多入群请添加小编微信号yanjinhuawechat 或 W_Feng_aiQ邀请入群需备注WP...

dotNET跨平台 818

通过Robotstudio修改机器人程序的具体方法和步骤

通过Robotstudio修改机器人程序的具体方法和步骤

Robot_PLC_HMI_Automation 6393

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

AvaloniaUI中DataGrid列头样式自定义问题解析

概述在使用AvaloniaUI框架开发桌面应用时,DataGrid控件是一个常用的数据展示组件。许多开发者在使用过程中会遇到列头(Header)样式定制的问题,特别是对Padding和Alignment等属性的控制需求。本文将深入分析这一问题,并提供完整的解决方案。问题背景在AvaloniaUI的Fluent主题下,DataGridTextColumn的Header默认会应用特定的样式:左侧内边距固定为12像素内容默认居中对齐。

qq_38230916的博客 125

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

WPF DataGrid自定义样式模板 列表头分隔线 滚动条滑块大小设定 动态数据绑定和更新

[ 效果图回去放,代码在后面 ][ 用到的一些定义如果没有附代码可以随便写个看下效果,因为直接从项目中copy出来的,难免漏掉点点... ]首先,有几点需要注意:1.表头样式 [ DataGridColumnHeader ]  默认带分割线,但每列表头左右分割线都占1px,也就是说假如有三列:a.  表格最左、右边应该不需要分割线,但默认的有1pxb.  中间需要1px分割线,但默认有2px(相邻...

qq_20758141的博客 9225

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

解决WPF中DataGrid的列表头不显示下划线的问题

今天在我自己写的一个WPF程序中执行sql语句查询Oracle数据库时,发生一个很奇怪的错误,对于我输入的列名,一直提示标识符错误。 我是先根据select *查出来的列名,然后执行上图中选中的语句,一直报错。去网上搜都是说与oracle的关键字冲突了,要加双引号。但是加了之后,仍然报一样的错误,没有效果。 实在想不出解决办法,于是我用Toad看了一下表结构,发现这里面的LEVELCODE...

C# UWP开发技术探讨 1850

WPF中DataGrid动态生成列及自定义表头结构

DataGrid动态生成列并实现数据绑定,以及如何实现复杂的表头和列内容

羽木落凡的博客 1万+

DataGrid组件_自定义头模板

Silverlight强大的DataGrid组件_自定义头模板(HeaderTemplate) 时间:2010-01-02 14:55来源:博客园 作者:Kinglee 点击: 1873次 在 DataGrid 的开发设计中,我们经常会碰到设计样式各异的表头以满足各种要求。而头模板的作用是显示 DataGrid 控件的首行中的文本、图片或是绑定数据的。通过对头模板的设定,可以...

abcabc5153的博客 182

示例:WPF中DataGrid简单设置合并列头

应用DataGridTemplateColumn自定义列头信息和单元格信息。

HeBianGu的博客 1922

强大的DataGrid组件[9]_自定义头模板(HeaderTemplate)——Silverlight学习笔记[17]

在DataGrid的开发设计中,我们经常会碰到设计样式各异的表头以满足各种要求。而头模板的作用是显示DataGrid控件的首行中的文本、图片或是绑定数据的。通过对头模板的设定,可以为我们定制所需样式的DataGrid。本文将为大家介绍如何自定义DataGrid的头模板。   具体步骤: 1)在XAML文件中的UserControl标签中加入如下命名空间: xmlns:dataprimiti...

weixin_34253126的博客 140

WPF (DataGridColumnHeader)实现自义定列头样式 并绑定数据

实现功能是这样的 自定义列头 样式 样式里的 数据来源于后台绑定 这篇就说头样式 和头样式数据绑定 思路 1)实现功能的时候 首先想的是编辑列头样式 选择使用DataGridTextColumn 编辑 DataGridColumnHeader 样式 样式很简单 就布局好了 这段结束 2)动态列 没有要求换肤 所以就没有完全使用MVVM 直接写后台循环 到这里数据有了 ...

时意 1万+

WPF的Datagrid显示,样式(隔行换色)

主要写一些最近一段时间学习Wpf的显示 直接显示与.net中的gridview有些相似,直接把一个list扔入datagrid中就可以显示,都可以自动的把对象的属性加载到页面上。 MainWindow.xaml.cs public MainWindow() { InitializeComponent(); } ...

weixin_30338481的博客 91
上一篇: JRE 浅谈
下一篇: 利用WPF MediaElement去播放视频或者音乐
泉水老叮当
博客等级 码龄10年 9粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值