You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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,提问作者江川涼一

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 13:02:06