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

Edw*_*uay 80 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>
Run Code Online (Sandbox Code Playgroud)

Jar*_*Par 138

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

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

<ListBox 
    ItemsSource="{Binding}" 
    ScrollViewer.VerticalScrollBarVisibility="Visible">
</ListBox>
Run Code Online (Sandbox Code Playgroud)

将此值设置为"自动"将根据需要弹出滚动条.

  • 在我的例子中,我将`ListBox`放在`ScrollViewer`中,并且`ListBoxItems`在`ListBox`的大小之外伸展到他们想要的宽度.删除`ScrollViewer`并设置`ScrollViewer.VerticalScrollBarVisibility ="Visible"`和`ScrollViewer.Horizo​​ntalScrollBarVisibility ="Disabled"`就可以了.谢谢您的帮助! (3认同)

yos*_*rel 27

ListBox已经包含ScrollViewer.默认情况下ScrollBar,当内容多于空格时,将显示.但是一些容器调整自身以适应其内容(例如StackPanel),因此永远不会有"比空间更多的内容".在这种情况下,ListBox总是给予内容所需的空间.

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

如果主机面板是垂直的StackPanel,您需要VerticalScrollBar将高度设置为ListBox自身.对于其他类型的容器,例如Grid,ListBox可以由容器约束.例如,您可以将原始代码更改为如下所示:

<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>
Run Code Online (Sandbox Code Playgroud)

请注意,重要的不仅仅是直接容器.在您的示例中,直接容器是a Grid,但由于它Grid包含在a中StackPanel,因此外部StackPanel会扩展以容纳其直接子项Grid,以便该子项可以扩展以容纳子项(the ListBox).

如果你在任何点限制高度 - 通过设置高度ListBox,通过设置内部的高度Grid,或简单地通过使外部容器a Grid- 然后每当有太多列表项目时自动出现垂直滚动条适合控制.


Edw*_*uay 17

我在ListBox中添加了一个"Height",它很好地添加了滚动条.

  • 因为它位于StackPanel中,所以它可以快速获得所需的所有空间,因此它不认为*需要*滚动条. (15认同)
  • 尽量避免使用高度和宽度属性,因为它们可能难以在路上进行更改.你最好选择JaredPar的解决方案. (8认同)