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


в приведенном ниже примере у меня есть список с десятками имен шрифтов в нем.

Я бы подумал, что это будет автоматически иметь вертикальную полосу прокрутки, так что вы можете выбрать любой шрифт, а не только первые в списке, но это не так.

поэтому я добавил "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 70

7 ответов:

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

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

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

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

ListBox уже содержит ScrollViewer. По умолчанию ScrollBar будет отображаться, когда есть больше контента, чем пространства. Но некоторые контейнеры изменяют размер для размещения их содержимого (например,StackPanel), поэтому никогда не бывает "больше контента, чем пространства". В таких случаях ListBox всегда дается столько места, сколько необходимо для содержания.

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

в случае, если хост-панель вертикальная StackPanel а ты хочешь VerticalScrollBar вы должны установить высоту на . Для других типов контейнеров, например 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, так что этот ребенок может расширяться, чтобы вместить его ребенок (the ListBox).

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

Я добавил "высоту" в свой список, и он добавил полосу прокрутки красиво.

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

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

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

XAML ListBox Scroller-Windows 10 (UWP)

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