avalonia datagrid 目前原生不支持 frozencolumn,因其轻量跨平台设计优先性能与一致性,滚动机制共用 scrollviewer 无法独立锁定列;替代方案包括双 datagrid 同步滚动、第三方扩展或自定义模板。

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