Как я могу получить вертикальную полосу прокрутки в моем ListBox?

В приведенном ниже примере у меня есть 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>

Ответ 1

Проблема с вашим решением заключается в том, что вы помещаете полосу прокрутки вокруг ListBox, где вы, вероятно, хотите разместить ее внутри ListBox.

Если вы хотите закрепить полосу прокрутки в своем ListBox, используйте свойство ScrollBar.VerticalScrollBarVisibility.

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

Установка этого значения в значение "Авто" отображает полосу прокрутки по мере необходимости.

Ответ 2

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>

Обратите внимание, что это не просто непосредственный контейнер. В вашем примере непосредственный контейнер представляет собой Grid, но поскольку этот Grid содержится в StackPanel, внешний StackPanel расширяется для размещения его непосредственного дочернего Grid, так что этот ребенок может расширяться до разместить его ребенка (ListBox).

Если вы ограничиваете высоту в любой точке — установив высоту ListBox, установив высоту внутреннего Grid или просто создав внешний контейнер a Grid — то вертикальная полоса прокрутки появится автоматически в любое время, когда в элементе управления слишком много элементов списка.

Ответ 3

Я добавил "Height" в свой ListBox, и он добавил панель прокрутки.

Ответ 4

Полоса прокрутки автоматически добавляется в поле "Список", если для ее видимости не установлено значение "Скрыто". Всякий раз, когда размер элементов списка превышает тот, который может отображаться внутри списка, вертикальное или горизонтальное окно списка можно увидеть во время выполнения.

Ответ 5

В моем случае количество элементов в ListBox является динамическим, поэтому я не хотел использовать свойство Height. Вместо этого я использовал MaxHeight, и он работает хорошо. Полоса прокрутки появляется, когда она заполняет пространство, которое я выделил для него.

Ответ 6

У меня была та же проблема, у меня был ComboBox, за которым следует ListBox в StackPanel, и полоса прокрутки для ListBox не показывалась. Я решил это, поставив их в DockPanel. Я установил ComboBox DockPanel.Dock = "Вверх" и пусть ListBox заполнит оставшееся пространство.

Ответ 7

XAML ListBox Scroller - Windows 10 (UWP)

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