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

Avalonia.Controls.DataGrid自动合并列

让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决定如何合并,返回当前行与上一行和下一行的数据是否可以合并(现在只是简单的比较当前列的内容是否一致)。

有一个小小的问题,在滚动时合并列可能会显示空白。虽说在用的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 yet DataGridColumn 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);//否的时候,可能需要恢复透明度 } }

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

相关文章:

  • 阴阳师智能自动化:开源工具效率提升全指南
  • 2026光纤陀螺仪行业盘点:十大核心厂商技术实力全景解析与选型指南 - 深度智识库
  • SEO_如何通过内容优化有效提升SEO效果?(303 )
  • 2026年甲醇船用燃料公司口碑推荐/甲醇,甲醇制氢,甲醇燃料,甲醇汽油,甲醇灶用燃料 - 品牌策略师
  • 深度解析 Android 开发工程师(智能硬件/音视频方向)的技术栈与实战
  • Comsol模拟土壤中冰的融化过程:奇妙的微观世界之旅
  • 3步搞定视频转PPT:开源智能提取工具终极指南
  • 手把手教你用Python做本地AI聊天机器人最终实战篇
  • ImStudio 终极指南:5步掌握实时GUI布局设计工具
  • 比rm -rf更安全?用Python脚本实现可控的目录删除(附完整代码)
  • 好写作AI:博士毕业论文的“学术领航灯塔”
  • 企业管理客户资源,这款工作手机实用性拉满 - 资讯焦点
  • 专业级流媒体下载器实战解析:7个高效配置技巧掌握N_m3u8DL-RE
  • Qwen2.5-14B-Instruct开源模型落地:像素剧本圣殿短视频脚本批量生成
  • 3步打造个人数字时光机:GetQzonehistory备份QQ空间全攻略
  • 新闻科技简报 (2026-04-03)
  • FlyEnv 4.9.7:本地开发环境的终极解决方案,轻松管理PHP、FTP和Tomcat服务
  • 2026年专业的净水器源头厂家口碑排行 - 资讯焦点
  • 原装W25N04KVZEIR 4Gbit SLC SPI NAND Flash——华邦高性能存储芯 Winbond华邦 电子元器件IC
  • 三分钟完成Axure中文界面配置:告别英文困扰,专注原型设计
  • 千匠网络B2B软件开发:定制化数智引擎,重构企业级B2B核心竞争力 - 圆圆小达人
  • AI驱动网络设计:让快马智能生成高可用ensp数据中心项目与配置
  • DMA内存访问与Cheat Engine插件开发全指南:零基础配置到高效内存分析
  • 基于朴素贝叶斯分类算法的收入预测:Python 数据挖掘项目实战
  • 道路巡查精准检测优选:多维度技术测评,谁更胜一筹? - 资讯焦点
  • openclaw添加本地大模型支持接受图片输入
  • 让ai成为你的linux导师,基于快马平台打造智能命令查询与解释助手
  • 图像增强技术指南:让模糊图片重获新生的实用方法
  • 新手友好:在快马平台上用代码学习77成色s35与s35l材料基础
  • 构建实战级域名管家:基于快马平台开发jxx登录页全功能监测应用