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 的虚拟化与渲染逻辑)










