Avalonia DataGrid 目前原生不支持 FrozenColumn,因其轻量跨平台设计优先性能与一致性,滚动机制共用 ScrollViewer 无法独立锁定列;替代方案包括双 DataGrid 同步滚动、第三方扩展或自定义模板。
Avalonia 的
目前(截至 2024 年稳定版 11.x)**原生不支持
(冻结列)功能**,也没有类似 WPF 中
或
的内置属性。
为什么 Avalonia DataGrid 没有 FrozenColumn?
Avalonia 的
是一个轻量、跨平台的实现,优先保证性能与一致性,尚未将冻结列这类高级 UI 行为纳入核心控件。其滚动机制基于统一的
,列和行共用同一个滚动上下文,无法独立锁定某几列。
可行的替代方案
虽然不能直接设
,但可通过以下方式模拟冻结效果:
拆分为两个并排 DataGrid
:左侧网格显示固定列(如 ID、姓名),禁用水平滚动;右侧网格显示其余列,并同步垂直滚动位置。通过绑定
或事件监听保持滚动同步。
使用第三方扩展库
:社区项目
本身未提供,但可关注
Wieslaw Soltes 的 Avalonia 扩展集
或
ControlCatalog
中的实验性示例——部分开发者已实现双网格联动的冻结列封装控件。
自定义模板 + Canvas 定位(进阶)
:重写
的
,将首 N 列抽离到独立
或
中,设置
并手动处理点击坐标映射,同时监听主网格滚动偏移来平移冻结区域。适合对性能和控制力要求极高、且能接受维护成本的场景。
简单同步滚动示例(双 DataGrid 方案)
在 XAML 中定义两个
,共享同一
,左侧只绑定关键列:
在代码中绑定滚动事件(C#):
未来是否可能原生支持?
该需求已在 Avalonia GitHub 仓库中被多次提出(如
#8297
),社区反馈积极。若你依赖此功能,建议:
– 给相关 issue 点赞以提升优先级
– 在
Discussions
中分享你的使用场景
– 考虑参与 PR 实现(需深入理解
的虚拟化与渲染逻辑)
DataGridFrozenColumnScrollViewer.CanContentScrollDataGrid.FrozenColumnCountDataGridScrollViewerFrozenColumnCountScrollViewer.VerticalOffsetAvalonia.Controls.DataGridDataGridTemplateCanvasPanelIsHitTestVisible="False"DataGridItemsSource
// 获取两个 DataGrid 内部的 ScrollViewer
var frozenScroll = FrozenGrid.FindControl("PART_ScrollViewer");
var mainScroll = MainGrid.FindControl("PART_ScrollViewer");
frozenScroll.ScrollChanged += (, e) =>
mainScroll!.ScrollToVerticalOffset(e.Offset.Y);
mainScroll.ScrollChanged += (, e) =>
frozenScroll!.ScrollToVerticalOffset(e.Offset.Y);
DataGrid