Как я могу получить вертикальную полосу прокрутки в моем списке?
в приведенном ниже примере у меня есть список с десятками имен шрифтов в нем.
Я бы подумал, что это будет автоматически иметь вертикальную полосу прокрутки, так что вы можете выбрать любой шрифт, а не только первые в списке, но это не так.
поэтому я добавил "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 ответов:
проблема с вашим решением заключается в том, что вы помещаете полосу прокрутки вокруг списка, где вы, вероятно, хотите поместить его в список.
Если вы хотите заставить полосу прокрутки в вашем списке, используйте полосу прокрутки.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
, так что этот ребенок может расширяться, чтобы вместить его ребенок (theListBox
).если вы ограничите высоту в любой точке-установив высоту
ListBox
, установив высоту внутреннегоGrid
, или просто сделав внешний контейнерGrid
- затем вертикальный свиток панель будет отображаться автоматически каждый раз, когда есть слишком много элементов списка, чтобы поместиться в элементе управления.
полоса прокрутки добавляется в список автоматически, если ее обнаружения скрытых. Всякий раз, когда размер элементов списка превышает один, который может быть показан внутри списка вертикальный или горизонтальный список можно увидеть во время выполнения.
в моем случае количество элементов в списке является динамическим, поэтому я не хотел использовать свойство Height. Я использовал MaxHeight вместо этого, и это работает хорошо. Полоса прокрутки появляется, когда она заполняет пространство, которое я выделил для нее.