当前位置: 首页 > news >正文

Avalonia.Controls.DataGrid自动合并列 - 生命体验之kevin

Winform在用的DataGridView修改为通过线条和透明的方式实现了合并列的效果。一段时间也在留意Avalonia.Controls.DataGrid是否也有类似的做法。一直没有心思去看那些代码,水平有限,实在搞不懂XML/Content一类如何实现绘制内容的。借着AI的帮助终于能试着去修改了。

让AI从DataGrid的以下方法入手

        private void AddNewCellPrivate(DataGridRow row, DataGridColumn column){DataGridCell newCell = new DataGridCell();PopulateCellContent(isCellEdited: false,dataGridColumn: column,dataGridRow: row,dataGridCell: newCell);if (row.OwningGrid != null){newCell.OwningColumn = column;newCell.IsVisible = column.IsVisible;if (row.OwningGrid.CellTheme is {} cellTheme){newCell.SetValue(ThemeProperty, cellTheme, BindingPriority.Template);}}row.Cells.Insert(column.Index, newCell);// 智能AutoMerge逻辑:比较当前行和下一行的数据//ApplySmartAutoMerge(row, column, newCell);}

最后发现,DataGrid并没有为每行数据创建DataGridRow/DataGridCell,且还会复用这些创建出来的DataGridCell显其他行的数据。就是说上面的方法只是开始的显示内容是可预测的。

多次尝试后,发现绘制前都会调用DataGridCell的EnsureGridLine方法,于是将合并的代码主要放在其中

internal void EnsureGridLine(DataGridColumn lastVisibleColumn)
{if (OwningGrid != null && _rightGridLine != null){if (OwningGrid.VerticalGridLinesBrush != null && OwningGrid.VerticalGridLinesBrush != _rightGridLine.Fill){_rightGridLine.Fill = OwningGrid.VerticalGridLinesBrush;}//忽略其他代码
// 调用DataGrid的CheckCellToMerge方法var (isSameAsPrevious, isSameAsNext) = OwningGrid?.CheckCellToMerge(this) ?? (false, false); // 根据不同的组合情况处理底边框和透明度 HandleMergeResult(isSameAsPrevious, isSameAsNext); }

至此,DataGrid决定如何合并,返回当前行与上一行和下一行的数据是否可以合并(现在只是简单的比较当前列的内容是否一致)。

simplemerge

有一个小小的问题,在滚动时合并列可能会显示空白。虽说在用的winform版的datagridview也有这个小问题。但新的东西多少有点改进,对吧。于是我向AI发出要求。最大的帮助就是判断是否是当前显示的第一列的方法了。

/// <summary>
/// 判断指定行是否为可视区域的第一行
/// </summary>
/// <param name="row">要检查的行</param>
/// <returns>true表示是可视区域的第一行,false表示不是</returns>
public bool IsFirstVisibleRow(DataGridRow row)
{if (_rowsPresenter == null || row == null)return false;// 遍历可视区域的所有行,找到索引最小的行int firstVisibleRowIndex = int.MaxValue;foreach (Control element in _rowsPresenter.Children){if (element is DataGridRow visibleRow && visibleRow.IsVisible){firstVisibleRowIndex = Math.Min(firstVisibleRowIndex, visibleRow.Index);}}// 如果指定行索引等于可视区域最小索引,则为第一行return row.Index == firstVisibleRowIndex;
}

人工分析后发现,DataGridCell的EnsureGridLine不知为何只是lastVisibleColumn有调用,并不是行中的全部列。滚动的刷新由DataGridCellsPresenter发起,看以下方法

internal void EnsureFillerVisibility()
{DataGridFillerColumn fillerColumn = OwningGrid.ColumnsInternal.FillerColumn;//忽略其他代码// This must be done after the Filler visibility is determined.  This also must be done// regardless of whether or not the filler visibility actually changed values because// we could scroll in a cell that didn't have EnsureGridLine called yetDataGridColumn lastVisibleColumn = OwningGrid.ColumnsInternal.LastVisibleColumn;if (lastVisibleColumn != null){DataGridCell cell = OwningRow.Cells[lastVisibleColumn.Index];cell.EnsureGridLine(lastVisibleColumn);//不知道为什么只是最后一列需要执行。
    }// 检查是否为首行显示,如果是则清除合并单元格的透明度bool isFirstVisualRow = (OwningGrid?.IsFirstVisibleRow(OwningRow) == true);foreach (DataGridCell cell in OwningRow.Cells){cell?.ClearMergeOpacity(isFirstVisualRow);//否的时候,可能需要恢复透明度
    }
}

好了,这就是全部修改。代码在gitee

https://gitee.com/kevin2y/Avalonia.Controls.DataGrid/tree/feature/auto-merge-enhancement

 

http://www.jsqmd.com/news/366708/

相关文章:

  • 成都二手房装修|成都里林设计专属翻新方案 先装修后付款解锁蓉城家装新体验 - 推荐官
  • 成都半包装修|里林设计专属半包服务 主材自主选 + 精工辅材造,高性价比装出理想家 - 推荐官
  • 2026 佛山英语雅思培训教育机构推荐:雅思培训课程中心权威口碑榜单 - 苏木2025
  • 电机NVH计算,及其适合新入门的uu,按照以前SCI二区的流程做的(图二),联系模型对照自己做...
  • 不会用Gemini的硕博生,注定要吃更多苦。一文汇总Gemini 3.0 Flash科研技巧
  • 不安全通信实现安全传输-stunnel
  • DeepSeek总结的PostgreSQL 数组的隐藏成本
  • ue 隐藏内衣教程
  • 电影推荐系统 | Python Django 协同过滤算法 Echarts可视化开发 大数据 人工智能 deepseek 毕业设计源码(建议收藏)✅
  • Deepseek+RD-Agent 自动化模型生成及进化
  • Vue插槽(Slot)全分类解析
  • 成都旧房翻新|成都里林设计一站式翻新服务 先装修后付款让蓉城业主更安心 - 推荐官
  • 2026年全国男士假发品牌哪家专业?多家品牌实力拆解与场景适配指南 - 深度智识库
  • 2026 保定英语雅思培训教育机构推荐/雅思培训课程中心权威口碑榜单 - 苏木2025
  • ICG-DOTA-NHS酯,ICG-DOTA SE荧光标记的关键“桥梁”
  • 2026 北京英语雅思培训教育机构推荐/雅思培训课程中心权威口碑榜单 - 苏木2025
  • C++中std::string的弱点:你可能未曾注意到的缺点
  • 2026年专业独立站全托管GEO优化代运营外包服务商推荐 - 品牌推荐大师
  • 2026年热门的混凝土地坪厂家信誉综合参考 - 深度智识库
  • 经济学中的最优化思想:拉格朗日乘数法与约束决策模型
  • 2026 保定英语雅思培训教育机构推荐,雅思培训课程中心权威口碑榜单 - 苏木2025
  • Tailscale + Win10跳板 实现安全的内网穿透
  • #贪心,树状数组#洛谷 5041 [HAOI2009] 求回文串
  • 2026 北京英语雅思培训教育机构推荐|雅思培训课程中心权威口碑榜单 - 苏木2025
  • 有没有ASP.NET示例代码展示大文件的目录结构断点续传?
  • 2026 保定英语雅思培训教育机构推荐:雅思培训课程中心权威口碑榜单 - 苏木2025
  • 深耕蓉城家装十余载 成都里林设计以专业与匠心打造全维度家装服务体系 - 推荐官
  • 萤石开放平台 音视频 | 取流协议说明
  • 2026 佛山英语雅思培训教育机构推荐,雅思培训课程中心权威口碑榜单 - 苏木2025
  • 【Python全栈开发】第2讲 | 数据结构全实战、流程控制与 Pythonic 迭代艺术