无需设置高度,实现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
相关产品推荐
相关产品推荐

