经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » ASP.net » 查看文章
WPF随笔收录-DataGrid固定右侧列
来源:cnblogs  作者:流浪g  时间:2024/4/19 8:59:30  对本文有异议

一、前言

在项目开发过程中,DataGrid是经常使用到的一个数据展示控件,而通常表格的最后一列是作为操作列存在,比如会有编辑、删除等功能按钮。但WPF的原始DataGrid中,默认只支持固定左侧列,这跟大家习惯性操作列放最后不符,今天就来介绍一种简单的方式实现固定右侧列。(这里的实现方式参考的大佬的两个DataGrid合并在一起的方式,原博客:https://www.cnblogs.com/akwkevin/p/17872348.html

二、正文

1、上面大佬的实现,就直接基于他自己的控件库里实现的,这里我介绍的方式是如何引用了别的第三方库的情况下,在项目代码中再实现自定义可以固定右侧列的DataGrid控件;

2、首先新建个项目,项目里引用了HandyControl控件库和微软的mvvm库。

 3、给项目添加一个自定义控件,记得不是自定义用户控件,这里命名为MyDataGrid,然后就可以从上面大佬那里搬代码过来,关键就是添加RightFrozenCount这个依赖属性代码和两个DataGrid之间的滚动同步代码

  1. public int RightFrozenCount
  2. {
  3. get { return (int)GetValue(RightFrozenCountProperty); }
  4. set { SetValue(RightFrozenCountProperty, value); }
  5. }
  6. public static readonly DependencyProperty RightFrozenCountProperty =
  7. DependencyProperty.Register(nameof(RightFrozenCount), typeof(int), typeof(MyDataGrid),
  8. new PropertyMetadata(0, OnRightFrozenCountChanged));
  9. private static void OnRightFrozenCountChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  10. {
  11. if (d is MyDataGrid dataGridRightFrozen)
  12. {
  13. dataGridRightFrozen.OnRightFrozenCountChanged();
  14. }
  15. }
  16. private void OnRightFrozenCountChanged()
  17. {
  18. if (_rightDataGrid != null)
  19. {
  20. if (RightFrozenCount > 0)
  21. {
  22. for (int i = 0; i < _rightDataGrid.Columns.Count; i++)
  23. {
  24. var column = _rightDataGrid.Columns[i];
  25. _rightDataGrid.Columns.Remove(column);
  26. Columns.Add(column);
  27. }
  28. for (int i = 0; i < RightFrozenCount; i++)
  29. {
  30. var last = Columns[^1];
  31. Columns.Remove(last);
  32. _rightDataGrid.Columns.Insert(0, last);
  33. }
  34. _rightDataGrid.SetCurrentValue(VisibilityProperty, Visibility.Visible);
  35. }
  36. else
  37. {
  38. _rightDataGrid.SetCurrentValue(VisibilityProperty, Visibility.Collapsed);
  39. }
  40. }
  41. }
  1. public override void OnApplyTemplate()
  2. {
  3. base.OnApplyTemplate();
  4. if (_scrollViewer != null)
  5. {
  6. _scrollViewer.ScrollChanged -= ScrollViewer_ScrollChanged;
  7. }
  8. if (_rightScrollViewer != null)
  9. {
  10. _rightScrollViewer.ScrollChanged -= RightScrollViewer_ScrollChanged;
  11. }
  12. if (_rightDataGrid != null)
  13. {
  14. _rightDataGrid.ScrollViewerChanged -= ScrollViewerChanged;
  15. _rightDataGrid.SelectionChanged -= RightDataGrid_SelectionChanged;
  16. }
  17. _scrollViewer = GetTemplateChild(DG_ScrollViewer) as ScrollViewer;
  18. if (_scrollViewer != null)
  19. {
  20. _scrollViewer.ScrollChanged += ScrollViewer_ScrollChanged;
  21. }
  22. _rightDataGrid = GetTemplateChild(PART_Right) as DataGridScrollView;
  23. if (_rightDataGrid != null)
  24. {
  25. _rightDataGrid.ScrollViewerChanged += ScrollViewerChanged;
  26. _rightDataGrid.SelectionChanged += RightDataGrid_SelectionChanged;
  27. }
  28. SelectionChanged += DataGridRightFrozen_SelectionChanged;
  29. }
  30. private void ScrollViewerChanged(ScrollViewer viewer)
  31. {
  32. _rightScrollViewer = viewer;
  33. _rightScrollViewer.ScrollChanged += RightScrollViewer_ScrollChanged;
  34. }
  35. private void ScrollViewer_ScrollChanged(object sender, ScrollChangedEventArgs e)
  36. {
  37. _rightScrollViewer?.ScrollToVerticalOffset(_scrollViewer.VerticalOffset);
  38. }
  39. private void RightScrollViewer_ScrollChanged(object sender, ScrollChangedEventArgs e)
  40. {
  41. _scrollViewer?.ScrollToVerticalOffset(_rightScrollViewer.VerticalOffset);
  42. }
  43. private void RightDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
  44. {
  45. SetCurrentValue(SelectedItemProperty, _rightDataGrid.SelectedItem);
  46. }
  47. private void DataGridRightFrozen_SelectionChanged(object sender, SelectionChangedEventArgs e)
  48. {
  49. _rightDataGrid.SetCurrentValue(SelectedItemProperty, SelectedItem);
  50. }

4、接着去到HandyControl的开源库那里,找到DataGrid的样式,然后复制到项目中

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

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

7、代码地址:https://gitee.com/liulang_g/data-grid-demo

 

原文链接:https://www.cnblogs.com/liulangg/p/18140748

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号