如何在ListBox中获得垂直滚动条?

时间:2009-01-23 13:00:14

标签: wpf xaml listbox scrollviewer

在下面的示例中,我有一个包含许多字体名称的ListBox。

我原以为它会自动在它上面有一个垂直滚动条,这样你就可以选择任何字体,而不仅仅是列表中的第一个字体,但事实并非如此。

所以我添加了一个“ScrollViewer”并在右侧放置了一个“滚动条区域”,但滚动条区域中没有滚动条,因此您可以滚动(!)。

为什么滚动条不是自动的,如何强制滚动条?

<StackPanel Name="stack1">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="2*"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
        </Grid.RowDefinitions>
        <ScrollViewer>
            <ListBox Grid.Row="0" Name="lstFonts" Margin="3"  ItemsSource="{x:Static Fonts.SystemFontFamilies}"/>
        </ScrollViewer>
    </Grid>
</StackPanel>

7 个答案:

答案 0 :(得分:135)

您的解决方案的问题是您在ListBox周围放置一个滚动条,您可能希望将其放在ListBox中。

如果要在ListBox中强制滚动条,请使用ScrollBar.VerticalScrollBarVisibility附加属性。

<ListBox 
    ItemsSource="{Binding}" 
    ScrollViewer.VerticalScrollBarVisibility="Visible">
</ListBox>

将此值设置为“自动”将根据需要弹出滚动条。

答案 1 :(得分:25)

ListBox已包含ScrollViewer。默认情况下,当内容多于空格时,ScrollBar会显示。但是有些容器调整自己的大小来容纳它们的内容(例如StackPanel),所以永远不会有“比空间更多的内容”。在这种情况下,ListBox总是给予内容所需的空间。

为了计算具有比空间更多的内容的条件,应该知道大小。通过在ListBox元素本身或主机面板上明确设置大小,确保ListBox的大小有限。

如果主机面板是垂直StackPanel而你想要VerticalScrollBar,则必须在ListBox本身设置高度。对于其他类型的容器,例如GridListBox可以由容器约束。例如,您可以将原始代码更改为:

<Grid Name="grid1">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="2*"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
        </Grid.RowDefinitions>
        <ListBox Grid.Row="0" Name="lstFonts" Margin="3"
                 ItemsSource="{x:Static Fonts.SystemFontFamilies}"/>
    </Grid>
</Grid>

请注意,重要的不仅仅是直接容器。在您的示例中,直接容器是Grid,但由于Grid包含StackPanel,因此外部StackPanel会展开以容纳其直接子{{1}这样,孩子可以扩展以容纳孩子(Grid)。

如果您在任何点限制高度 - 通过设置ListBox的高度,设置内部ListBox的高度,或者只是将外部容器设为Grid - 只要有太多列表项适合控件,就会自动出现垂直滚动条。

答案 2 :(得分:17)

我在ListBox中添加了一个“Height”,它很好地添加了滚动条。

答案 3 :(得分:3)

滚动条会自动添加到“列表”框中,除非其可见性设置为“隐藏”。每当列表项的大小超过一个,可以在列表框内显示垂直或水平列表框在运行时可以看到。

答案 4 :(得分:1)

在我的情况下,ListBox中的项目数是动态的,所以我不想使用Height属性。我使用了MaxHeight而且效果很好。滚动条填满我为其分配的空间时会出现。

答案 5 :(得分:0)

我遇到了同样的问题,我在StackPanel中有一个ComboBox后跟一个ListBox,并且没有显示ListBox的滚动条。我通过将两个放在DockPanel中来解决这个问题。我设置了ComboBox DockPanel.Dock =“Top”并让ListBox填充剩余的空间。

答案 6 :(得分:0)

XAML ListBox滚轮 - Windows 10(UWP)

<Style TargetType="ListBox">
    <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Visible"/>
    <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Visible"/>
</Style>