WPF随笔收录-DataGrid固定右侧列
一、前言
在项目开发过程中,DataGrid是经常使用到的一个数据展示控件,而通常表格的最后一列是作为操作列存在,比如会有编辑、删除等功能按钮。但WPF的原始DataGrid中,默认只支持固定左侧列,这跟大家习惯性操作列放最后不符,今天就来介绍一种简单的方式实现固定右侧列。(这里的实现方式参考的大佬的两个DataGrid合并在一起的方式,原博客:https://www.cnblogs.com/akwkevin/p/17872348.html)
二、正文
1、上面大佬的实现,就直接基于他自己的控件库里实现的,这里我介绍的方式是如何引用了别的第三方库的情况下,在项目代码中再实现自定义可以固定右侧列的DataGrid控件;
2、首先新建个项目,项目里引用了HandyControl控件库和微软的mvvm库。

3、给项目添加一个自定义控件,记得不是自定义用户控件,这里命名为MyDataGrid,然后就可以从上面大佬那里搬代码过来,关键就是添加RightFrozenCount这个依赖属性代码和两个DataGrid之间的滚动同步代码
public int RightFrozenCount
{
get { return (int)GetValue(RightFrozenCountProperty); }
set { SetValue(RightFrozenCountProperty, value); }
} public static readonly DependencyProperty RightFrozenCountProperty =
DependencyProperty.Register(nameof(RightFrozenCount), typeof(int), typeof(MyDataGrid),
new PropertyMetadata(0, OnRightFrozenCountChanged)); private static void OnRightFrozenCountChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (d is MyDataGrid dataGridRightFrozen)
{
dataGridRightFrozen.OnRightFrozenCountChanged();
}
} private void OnRightFrozenCountChanged()
{
if (_rightDataGrid != null)
{
if (RightFrozenCount > 0)
{
for (int i = 0; i < _rightDataGrid.Columns.Count; i++)
{
var column = _rightDataGrid.Columns[i];
_rightDataGrid.Columns.Remove(column);
Columns.Add(column);
}
for (int i = 0; i < RightFrozenCount; i++)
{
var last = Columns[^1];
Columns.Remove(last); _rightDataGrid.Columns.Insert(0, last);
}
_rightDataGrid.SetCurrentValue(VisibilityProperty, Visibility.Visible);
}
else
{
_rightDataGrid.SetCurrentValue(VisibilityProperty, Visibility.Collapsed);
}
}
}
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
if (_scrollViewer != null)
{
_scrollViewer.ScrollChanged -= ScrollViewer_ScrollChanged;
}
if (_rightScrollViewer != null)
{
_rightScrollViewer.ScrollChanged -= RightScrollViewer_ScrollChanged;
}
if (_rightDataGrid != null)
{
_rightDataGrid.ScrollViewerChanged -= ScrollViewerChanged;
_rightDataGrid.SelectionChanged -= RightDataGrid_SelectionChanged;
} _scrollViewer = GetTemplateChild(DG_ScrollViewer) as ScrollViewer;
if (_scrollViewer != null)
{
_scrollViewer.ScrollChanged += ScrollViewer_ScrollChanged;
} _rightDataGrid = GetTemplateChild(PART_Right) as DataGridScrollView;
if (_rightDataGrid != null)
{
_rightDataGrid.ScrollViewerChanged += ScrollViewerChanged;
_rightDataGrid.SelectionChanged += RightDataGrid_SelectionChanged;
}
SelectionChanged += DataGridRightFrozen_SelectionChanged;
} private void ScrollViewerChanged(ScrollViewer viewer)
{
_rightScrollViewer = viewer;
_rightScrollViewer.ScrollChanged += RightScrollViewer_ScrollChanged;
} private void ScrollViewer_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
_rightScrollViewer?.ScrollToVerticalOffset(_scrollViewer.VerticalOffset);
} private void RightScrollViewer_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
_scrollViewer?.ScrollToVerticalOffset(_rightScrollViewer.VerticalOffset);
} private void RightDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
SetCurrentValue(SelectedItemProperty, _rightDataGrid.SelectedItem);
} private void DataGridRightFrozen_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
_rightDataGrid.SetCurrentValue(SelectedItemProperty, SelectedItem);
}
4、接着去到HandyControl的开源库那里,找到DataGrid的样式,然后复制到项目中

5、然后对原来的Style进行修改,对ControlTemplate的布局添加上作为固定列的DataGrid


6、至此,自定义支持右侧列固定的DataGrid就完成了,效果如下:

7、代码地址:https://gitee.com/liulang_g/data-grid-demo
WPF随笔收录-DataGrid固定右侧列的更多相关文章
- WPF中使用DataGrid时操作列按钮问题
在使用DataGrid的过程中,我们有时候需要对选取的某一行数据进行多个操作,这个时候操作列只有一个按钮显然无法满足我们的要求,我们需要多个按钮才能达到我们的目的. UI页面代码: <Grid& ...
- WPF随笔收录-解析DICOM文件
一.前言 在最近的项目开发中,涉及到了解析DICOM文件.根据百度百科可知,DICOM(Digital Imaging and Communications in Medicine)即医学数字成像和通 ...
- WPF 中获取DataGrid 模板列中控件的对像
WPF 中获取DataGrid 模板列中控件的对像 #region 当前选定行的TextBox获得焦点 /// <summary> /// 当前选定行的TextBox获得焦点 /// &l ...
- WPF DataGrid添加编号列
WPF DataGrid添加编号列? 第一步:<DataGridTemplateColumn Header="编号" Width="50" MinWidt ...
- css 两列 左侧列固定 width: 100px; float: left; 右侧列自适应 margin-left:100px; 注意要用在div上的style
css 两列 左侧列固定 width: 100px; float: left; 右侧列自适应 margin-left:100px; 注意要用在div上的style .con1{ width: 100p ...
- WPF Datagrid 动态生成列 并绑定数据
原文:WPF Datagrid 动态生成列 并绑定数据 说的是这里 因为列头是动态加载的 (后台for循环 一会能看到代码) 数据来源于左侧列 左侧列数据源 当然num1 属于临时的dome使用 可 ...
- WPF datagrid 动态增加列
DataGrid动态增加列 <Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.m ...
- WPF的DataGrid的某个列绑定数据的三种方法(Binding、Converter、DataTrigger)
最近在使用WPF的时候,遇到某个列的值需要根据内容不同进行转换显示的需求.尝试了一下,大概有三种方式可以实现: 1.传统的Binding方法,后台构造好数据,绑定就行. 2.转换器方法(Convert ...
- WPF 自带Datagrid编辑后无法更新数据源的问题
原文 WPF 自带Datagrid编辑后无法更新数据源的问题 解决办法: 在列的绑定属性里加上UpdateSourceTrigger,示例XAML如下 <DataGrid Grid.Row=& ...
- EasyUI datagrid动态生成列
任务描述:根据用户选择时间段,生成列数据,如图
随机推荐
- 在Linux下开启指定端口号
1.查看某个端口是否已开启,如果提示no表示未开启 #8888表示要查询的端口号firewall-cmd --query-port=8888/tcp 2.永久开启端口号,提示 success 表示成功 ...
- 用于演示文稿的新 Dapr 幻灯片
Dapr 官方博客上(https://blog.dapr.io/posts/2024/03/10/new-dapr-slide-deck-for-your-presentations/)发布了一个新的 ...
- 28_FFmpeg音视频解封装格式
目录 一.什么是封装格式 二.使用 FFmpeg 实现解封装 1.创建解封装上下文打开流媒体文件 2.检索流信息 2.1.检索流信息 2.2.导出流信息到控制台 3.初始化音频解码器查找合适的音视流和 ...
- 引领文旅新体验!3DCAT实时云渲染助力打造“永不落幕”的湾区文采会元宇宙
2022年11月25日至27日,2022年粤港澳大湾区公共文化和旅游产品(东莞)采购会(简称"湾区文采会")在广东省东莞市文化馆举行. 文采会期间,文采会元宇宙线上虚拟展厅全新亮相 ...
- 干货分享 | UE游戏鼠标双击判定
UE虚幻引擎对于游戏开发者来说都不陌生,市面上有47%主机游戏使用虚幻引擎开发游戏.作为是一款游戏的核心动力,它的功能十分完善,囊括了场景制作.灯光渲染.动作镜头.粒子特效.材质蓝图等.本文介绍了虚幻 ...
- 大场景的倾斜摄影三维模型OBJ格式轻量化处理处理关键处理技术分析
大场景的倾斜摄影三维模型OBJ格式轻量化处理处理关键处理技术分析 大场景的倾斜摄影三维模型是指通过航空或地面摄影获取的大范围.高分辨率的地理环境数据.为了在虚拟环境中加载和渲染这些模型,需要对其进行O ...
- Linux修改账户密码
打开终端并登录到要修改密码的账户 输入 passwd 命令,然后 Enter 系统会提示你输入 Current password. 如果是第一次登录或者忘记密码,使用 passwd -d userna ...
- Linux下Bochs,NASM安装和使用
安装环境 以Ubuntu为例,先更新一下: sudo apt-get update sudo apt-get upgrade 然后安装Bochs环境: sudo apt-get install bui ...
- Nacos 服务发现,注册及管理
Nacos Nacos(官网: https://nacos.io) 发现,注册及管理. Nacos 支持发现,配置及管理几乎所有类型的服务: Kubernetes Service gRPC | Dub ...
- Unity 2022.3.20f1新功能,异步实例化预制体Object.InstantiateAsync
今天查看Unity 2022.3.20f1更新日志,发现新增了个异步实例化的功能,这个功能解决了Unity历史上实例化预制体卡顿的痛点,简直不要太爽. 具体的API文档请点击跳转. 做了个简单的实例化 ...