94

在下面的示例中,我有一个 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>
4

7 回答 7

159

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

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

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

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

于 2009-01-23T13:10:10.067 回答
33

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>

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

如果您在任意点约束高度——通过设置 的高度ListBox,设置内部的高度Grid,或者简单地通过使外部容器为Grida——那么当列表项太多时,垂直滚动条将自动出现适合控制。

于 2012-02-02T14:42:54.123 回答
17

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

于 2009-01-23T13:22:16.627 回答
4

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

于 2011-06-14T09:51:53.277 回答
1

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

于 2014-04-09T18:03:20.923 回答
0

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

于 2015-07-09T17:39:18.697 回答
0

XAML 列表框滚动器 - Windows 10(UWP)

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

于 2016-05-08T07:55:45.817 回答