如何在WPF DataGrid中启用超出最后一行的滚动功能?
WPF DataGrid实现“滚动超出最后一行”功能
由于DataGrid默认启用UI虚拟化(CanContentScroll=True),滚动范围由项数量决定,直接给ScrollContentPresenter加边距不会生效。以下是两种可行的实现方案:
方案一:保留虚拟化,添加底部空白占位符
适合数据量大、需要保留虚拟化性能的场景,通过修改DataGrid模板,在ItemsPresenter下方添加空白元素扩展滚动范围:
<Style TargetType="DataGrid"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="DataGrid"> <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" SnapsToDevicePixels="True"> <ScrollViewer x:Name="DG_ScrollViewer" Focusable="False"> <ScrollContentPresenter> <StackPanel Orientation="Vertical"> <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> <!-- 自定义底部空白高度,示例为200px --> <Border Height="200" /> </StackPanel> </ScrollContentPresenter> </ScrollViewer> </Border> </ControlTemplate> </Setter.Value> </Setter> </Style>
说明
- 用
StackPanel包裹ItemsPresenter和空白Border,让ScrollViewer将空白区域纳入滚动范围 - 空白高度可根据需求调整,也可绑定到ViewModel属性实现动态控制
方案二:禁用虚拟化,直接添加底部边距
适合数据量小、无需考虑虚拟化性能的场景,通过禁用虚拟化让ScrollContentPresenter的边距生效:
<DataGrid> <DataGrid.Template> <ControlTemplate TargetType="DataGrid"> <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" SnapsToDevicePixels="True"> <ScrollViewer x:Name="DG_ScrollViewer" Focusable="False" CanContentScroll="False"> <!-- 底部边距设为需要的空白高度 --> <ScrollContentPresenter Margin="0,0,0,200" /> </ScrollViewer> </Border> </ControlTemplate> </DataGrid.Template> </DataGrid>
说明
CanContentScroll="False"会关闭UI虚拟化,此时ScrollViewer按像素滚动,边距设置会生效- 数据量大时不建议使用,会导致加载和滚动性能下降
内容的提问来源于stack exchange,提问作者江川涼一
相关产品推荐
相关产品推荐

