Как я могу получить вертикальную полосу прокрутки в моем ListBox? - PullRequest
78 голосов
/ 23 января 2009

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

Ответы [ 7 ]

135 голосов
/ 23 января 2009

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

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

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

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

25 голосов
/ 02 февраля 2012

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).

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

17 голосов
/ 23 января 2009

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

3 голосов
/ 14 июня 2011

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

1 голос
/ 09 апреля 2014

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

0 голосов
/ 08 мая 2016

XAML ListBox Scroller - Windows 10 (UWP)

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

0 голосов
/ 09 июля 2015

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

...