【问题标题】:How can I get a vertical scrollbar in my ListBox?如何在我的 ListBox 中获得垂直滚动条?
【发布时间】:2016-05-08 15:55:45
【问题描述】:

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

【问题讨论】:

    标签: wpf xaml listbox scrollviewer


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 在我的例子中,我也将ListBox 放在了ScrollViewer 中,ListBoxItems 的宽度超出了ListBox 的大小。删除 ScrollViewer 并设置 ScrollViewer.VerticalScrollBarVisibility="Visible"ScrollViewer.HorizontalScrollBarVisibility="Disabled" 就可以了。感谢您的帮助!
    【解决方案2】:

    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 被扩展以容纳其直接子Grid,这样该子可以扩展到容纳 孩子(ListBox)。

    如果您在任意点限制高度——通过设置ListBox 的高度、设置内部Grid 的高度,或者简单地将外部容器设置为Grid——然后是一个垂直滚动条只要列表项太多而无法放入控件,就会自动出现。

    【讨论】:

    • 使用 DockPanel 作为父容器无需知道您计划添加多少元素作为子容器或预定义任何高度属性。为每个孩子定义 DockPanel.Dock=Top。这使您的“Scrollviewer-Childs”根据需要显示他们的滚动条。未经一般测试,它在我的用例中确实有效。 BR,丹尼尔
    • TLDR:将您的父元素从 StackPanel 更改为 Grid,因为 StackPanel 总是扩展到其子元素的高度。
    【解决方案3】:

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

    【讨论】:

    • 尽量避免使用 height 和 width 属性,因为它们可能会使更改变得困难。你最好选择 JaredPar 的解决方案。
    • 我这样做了,但它只是在右侧放置了一个“滚动条区域”,本身没有滚动条,而且我的列表从窗口底部一直向下延伸到永恒,我怎么能告诉列表框(停在窗口底部)?
    • 因为它在 StackPanel 中,所以它很高兴地得到了它需要的所有空间,所以它认为它需要滚动条。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-10-21
            • 2010-10-02
            • 1970-01-01
            • 1970-01-01
            • 2016-05-07
            • 1970-01-01
            相关资源
            最近更新 更多