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


83

在下面的示例中,我有一个列表框,其中包含数十种字体名称。

我以为它将自动在其上具有垂直滚动条,以便您可以选择任何字体,而不仅仅是列表中的第一个字体,但没有。

因此,我添加了一个“ 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>

Answers:


150

解决方案的问题是,您要将滚动条放在ListBox周围,可能要将其放在ListBox内。

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

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

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


3
在我的情况下,我也在ListBox里面放了一个东西ScrollViewer,那个东西ListBoxItems的伸展幅度超出了他们想要的宽度ListBox。删除ScrollViewer和设置ScrollViewer.VerticalScrollBarVisibility="Visible"ScrollViewer.HorizontalScrollBarVisibility="Disabled"完成了窍门。谢谢您的帮助!
普通话

29

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>

请注意,重要的不只是直接容器。在您的示例中,直接容器是a Grid,但是由于该Grid容器包含在a中StackPanel,所以外部容器将StackPanel扩展为容纳其直接子容器,以便该子容器Grid可以扩展以容纳子容器(ListBox)。

如果您在任意点上限制高度(通过设置的高度ListBox,通过设置内部Grid容器的高度或简单地通过将外部容器设置为a)Grid,则在列表项过多时,垂直滚动条会自动出现适合控制。


使用DockPanel作为父容器无需了解要计划添加多少个元素作为子元素或预定义任何Height属性。为每个孩子定义DockPanel.Dock = Top。这使您的“ Scrollviewer-Childs”根据需要显示其滚动条。没有经过全面测试,它确实在我的用例中起作用。丹尼尔
dba

1
TLDR:将您的父元素从更改为StackPanelGrid因为StackPanel始终会扩展到其子元素的高度。
乔什·诺

17

我向列表框添加了“高度”,它很好地添加了滚动条。


8
尽量避免使用height和width属性,因为它们可能会导致很难进行更改。您最好选择JaredPar的解决方案。
Bryan Anderson

1
我这样做了,但是它只是在右侧没有滚动条的情况下放置了一个“滚动条区域”,并且我的列表从窗口底部向下一直延伸到所有永恒,我该如何告诉列表框(停在窗口底部) )?
爱德华·坦格

15
因为它是在一个StackPanel,它欢快地被赋予它需要的所有空间,所以它不认为它需要一个滚动条。
Donnelle

4

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


1

在我的情况下,ListBox中的项目数是动态的,因此我不想使用Height属性。我改用了MaxHeight,效果很好。当滚动条填满我为其分配的空间时,将显示滚动条。


0

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


0

XAML ListBox滚动器-Windows 10(UWP)

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.