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

如何让包含可展开项的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>

问题截图

未展开状态

未展开状态截图

展开后(滚动条失效)

展开后滚动条失效截图


解决方案

关键调整点:

  1. 移除外层多余的ScrollViewer:ListBox本身内置ScrollViewer,额外嵌套会导致布局计算错误,无法触发滚动。
  2. 修改ListBox所在Grid行的高度:将ChildViews网格中第二行的Height="Auto"改为Height="*",让该行占据窗口剩余可用空间,限制ListBox的最大高度。
  3. 显式设置滚动条可见性:给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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 05:10:38