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; тогда вертикальная полоса прокрутки появится автоматически каждый раз, когда в элементе управления слишком много элементов списка.