如何让包含可展开项的ListBox滚动条正常工作?
问题:带Expander的ListBox项展开后滚动条失效
ListBox包含Studio、Actor、Category三个顶级项,每个项的模板内嵌套Expander,展开子项后内容超出窗口范围,但ListBox滚动条无法正常工作。推测因仅3个顶级项,ListBox未触发滚动逻辑,需调整布局让容器支持滚动。
主视图关键代码(原问题中标注--HERE--的部分)
<Window x:Class="FileNameTagger.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:system="clr-namespace:System;assembly=mscorlib" xmlns:local="clr-namespace:FileNameTagger" xmlns:tagTypes="clr-namespace:FileNameTagger.TagTypes" xmlns:shared="clr-namespace:Shared;assembly=Shared" xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes" mc:Ignorable="d" Height="600" Width="1080" ResizeMode="CanResizeWithGrip" Background="Transparent" ShowInTaskbar="True" WindowStartupLocation="CenterOwner" WindowState="Normal" SizeToContent="Manual" > <Window.Resources> <DataTemplate DataType="{x:Type tagTypes:TextListTagTypeViewModel}"> <tagTypes:TextListTagTypeView /> </DataTemplate> <DataTemplate DataType="{x:Type tagTypes:TextTagTypeViewModel}"> <tagTypes:TextTagTypeView /> </DataTemplate> <DataTemplate DataType="{x:Type tagTypes:EnumTagTypeViewModel}"> <tagTypes:EnumTagTypeView /> </DataTemplate> <DataTemplate DataType="{x:Type tagTypes:DateTagTypeViewModel}"> <tagTypes:DateTagTypeView /> </DataTemplate> </Window.Resources> <Window.DataContext> <local:MainWindowViewModel/> </Window.DataContext> <Border Background="RoyalBlue"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="50"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <Menu Grid.Row="0" Grid.Column="0"> <MenuItem Header="_File" Style="{StaticResource MenuButtonTheme}" > <MenuItem Header="_Load File" Command ="{Binding AddFileCommand}"> </MenuItem> <MenuItem Header="_New Tag" Command="{Binding ClearTagCommand}"/> <MenuItem Header="_Export Tag" Command="{Binding SaveTagCommand}"/> </MenuItem> <MenuItem Header="_Templates" Style="{StaticResource MenuButtonTheme}" > <MenuItem Header="_Import Tag Template" Command ="{Binding ImportTagTemplateCommand}"> </MenuItem> </MenuItem> </Menu> <Grid Grid.Row ="1" x:Name ="ChildViews"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <StackPanel Grid.Row="0" Orientation="Horizontal" HorizontalAlignment="Stretch"> <TextBlock FontSize="18" Margin="0,0,5,5">Selected File:</TextBlock> <TextBlock FontSize="18" Text="{Binding LoadedFile.Name}"/> </StackPanel> <ScrollViewer> <ListBox Grid.Row="1" x:Name="TagTypesListBox" ItemsSource="{Binding TagTypeViewModels}"/><!--HERE--> </ScrollViewer> <Grid Grid.Row="2" x:Name="ExportedTag"> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <TextBlock Grid.Column="0">Exported Tag:</TextBlock> <TextBox IsReadOnly="True" Grid.Column="1" Text="{Binding ExportedTag}" Margin="5"></TextBox> </Grid> </Grid> </Grid> </Border> </Window>
项数据模板代码
<DataTemplate x:Key ="TextListTagTypeItemDataTemplate"> <Grid> <Grid.RowDefinitions> <RowDefinition/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto" /> <ColumnDefinition /> <ColumnDefinition /> <ColumnDefinition /> <ColumnDefinition /> </Grid.ColumnDefinitions> <CheckBox IsChecked="{Binding Path=IsChecked, UpdateSourceTrigger=PropertyChanged}"> <WrapPanel> <TextBox Grid.Row="0" Grid.Column="1" Text="{Binding Path=Value}"/> <Button Grid.Column="3" Command="{Binding DataContext.UpdateTagDataCommand, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBox}}}" CommandParameter="{Binding}" HorizontalAlignment="Left" Padding="10,10,10,10" Margin="5,0,0,0" > <materialDesign:PackIcon Kind="ContentSave" Height="12" Padding="0,10,10,0"/> </Button> <Button Grid.Column="4" Command="{Binding DataContext.DeleteTagCommand, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBox}}}" CommandParameter="{Binding}" HorizontalAlignment="Left" Padding="10,10,10,10" Margin="5,0,0,0" > <materialDesign:PackIcon Kind="TrashCanCircle" Height="12" Padding="0,10,10,0"/> </Button> </WrapPanel> </CheckBox> </Grid> </DataTemplate>
问题截图
未展开状态

展开后(滚动条失效)

解决方案
关键调整点:
- 移除外层多余的ScrollViewer:ListBox本身内置ScrollViewer,额外嵌套会导致布局计算错误,无法触发滚动。
- 修改ListBox所在Grid行的高度:将
ChildViews网格中第二行的Height="Auto"改为Height="*",让该行占据窗口剩余可用空间,限制ListBox的最大高度。 - 显式设置滚动条可见性:给ListBox添加
VerticalScrollBarVisibility="Auto",确保滚动条按需显示。
修改后的核心代码片段:
<Grid Grid.Row ="1" x:Name ="ChildViews"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> <!-- 改为*,限制高度 --> <RowDefinition Height="*"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <!-- ... 其他代码 ... --> <!-- 移除外层ScrollViewer,直接保留ListBox --> <ListBox Grid.Row="1" x:Name="TagTypesListBox" ItemsSource="{Binding TagTypeViewModels}" VerticalScrollBarVisibility="Auto"/> <!-- ... 其他代码 ... --> </Grid>
原理说明:
- 当Grid行高设为
*时,ListBox的高度会被限制在窗口剩余空间内,Expander展开导致内容超出该高度时,ListBox内置的ScrollViewer会自动启用滚动。 - 原代码中
ScrollViewer嵌套在Auto高度的Grid行内,会随着内容无限延伸,无法触发滚动逻辑,因此必须移除。
内容的提问来源于stack exchange,提问作者Anthony Kubeka
相关产品推荐
相关产品推荐

