it-roy-ru.com

Как я могу получить вертикальную полосу прокрутки в моем 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>
73
Edward Tanguay

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

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

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

При установке этого значения на Auto будет появляться полоса прокрутки по мере необходимости.

130
JaredPar

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, так что этот дочерний элемент может расширяться для размещения его child (ListBox ).

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

24
yossharel

Я добавил «Высоту» в свой ListBox и он добавил полосу прокрутки.

16
Edward Tanguay

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

3
Paras

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

1
oldDavid

XAML ListBox Scroller - Windows 10 (UWP)

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

0
FazelMan

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

0
Bill Clyde