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

无需设置高度,实现UWP ListView内容超设备高度时垂直滚动

解决UWP ListView动态内容自动垂直滚动的问题

嗨,我懂你的需求:不想给ListView硬设高度/最大高度,希望它内容少的时候正常自适应,内容多到超过设备高度时自动启用垂直滚动对吧?你的问题出在当前的Grid布局没有限制ListView的最大高度——当RowDefinition用auto时,Grid会跟着ListView的内容无限拉伸,ListView永远不会触发内部滚动,因为它的高度足够装下所有内容。

给你两个简单可行的方案,都能满足你的需求:

方案一:XAML绑定直接设置最大高度(推荐)

这个方法不用写后台代码,直接在XAML里绑定到当前窗口的可见高度,让ListView的最大高度自动适配设备:

首先在页面根元素里引入命名空间:

<Page
    x:Class="YourNamespace.YourPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:windowsUI="using:Windows.UI.ViewManagement"
    >

然后修改你的ListView代码,加上MaxHeight绑定和滚动属性:

<Grid HorizontalAlignment="Stretch">
    <Grid.RowDefinitions>
        <RowDefinition Height="auto" />
    </Grid.RowDefinitions>
    <ListView
        Grid.Row="0"
        HorizontalAlignment="Stretch"
        VerticalAlignment="Top" <!-- 内容少时不拉伸,保持自适应高度 -->
        ScrollViewer.VerticalScrollMode="Auto"
        ScrollViewer.VerticalScrollBarVisibility="Auto"
        <!-- 绑定到当前窗口的可见高度,自动适配桌面/移动设备 -->
        MaxHeight="{x:Bind windowsUI:ApplicationView.GetForCurrentView().VisibleBounds.Height, Mode=OneWay}"
        >
        <!-- 你的ListView内容 -->
    </ListView>
</Grid>

这样做的好处是:

  • 内容少的时候,ListView高度自适应,不会占满整个屏幕
  • 内容超过设备高度时,ListView被限制在窗口高度内,自动启用垂直滚动
  • 完全不用硬写固定数值,自动适配不同设备

方案二:后台代码设置最大高度(适合需要调整其他元素高度的场景)

如果你的页面顶部有AppBar或者其他固定高度的元素,需要把它们的高度从窗口高度里减去,就用这个方法:

首先给ListView起个名字:

<ListView x:Name="MyDynamicListView"
          HorizontalAlignment="Stretch"
          VerticalAlignment="Top"
          ScrollViewer.VerticalScrollMode="Auto"
          ScrollViewer.VerticalScrollBarVisibility="Auto"
          >
    <!-- 你的内容 -->
</ListView>

然后在页面的Loaded事件里设置MaxHeight:

private void Page_Loaded(object sender, RoutedEventArgs e)
{
    var currentView = Windows.UI.ViewManagement.ApplicationView.GetForCurrentView();
    // 获取窗口可见高度
    double availableHeight = currentView.VisibleBounds.Height;
    
    // 如果有顶部AppBar,减去它的实际高度(比如你的AppBar叫TopAppBar)
    // availableHeight -= TopAppBar.ActualHeight;
    
    // 给ListView设置最大高度
    MyDynamicListView.MaxHeight = availableHeight;
}

别忘了在XAML里给Page绑定Loaded事件:

<Page ... Loaded="Page_Loaded">

关键注意点

  • 一定要把ListView的VerticalAlignment设为Top,不然内容少时它会被拉伸到MaxHeight,出现不必要的空白
  • 确保ScrollViewer.VerticalScrollMode和ScrollViewer.VerticalScrollBarVisibility都是Auto(默认可能是,但显式设置更稳妥)
  • 不要用ScrollViewer包裹ListView,会破坏ListView的虚拟化功能,导致大量数据时性能下降

内容的提问来源于stack exchange,提问作者nsds

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:29:54