В приведенном ниже примере у меня есть 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>
источник
ListBox
внутрь,ScrollViewer
иListBoxItems
они растягивались настолько широко, насколько хотели, за пределы размераListBox
. УдалениеScrollViewer
и установкаScrollViewer.VerticalScrollBarVisibility="Visible"
иScrollViewer.HorizontalScrollBarVisibility="Disabled"
сделали свое дело. Спасибо за помощь!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>
Обратите внимание, что важен не только непосредственный контейнер. В вашем примере непосредственным контейнером является a
Grid
, но посколькуGrid
он содержится в aStackPanel
, внешнийStackPanel
расширяется для размещения своего непосредственного дочернего элементаGrid
, так что этот дочерний элемент может расширяться для размещения своего дочернего элемента (ListBox
).Если вы ограничите высоту в любой точке - установив высоту
ListBox
, установив высоту внутреннегоGrid
или просто сделав внешний контейнер aGrid
- тогда вертикальная полоса прокрутки появится автоматически каждый раз, когда есть слишком много элементов списка для вписывается в контроль.источник
StackPanel
на,Grid
поскольку StackPanel всегда расширяется до высоты своих дочерних элементов.Я добавил «Высота» в свой ListBox, и он красиво добавил полосу прокрутки.
источник
Полоса прокрутки добавляется в список автоматически, если для ее видимости не установлено значение «Скрытый». Каждый раз, когда размер элементов списка превышает один, который может отображаться внутри окна списка, вертикальный или горизонтальный список можно увидеть во время выполнения.
источник
В моем случае количество элементов в ListBox является динамическим, поэтому я не хотел использовать свойство Height. Вместо этого я использовал MaxHeight, и он отлично работает. Полоса прокрутки появляется, когда заполняет выделенное для нее пространство.
источник
У меня была та же проблема: у меня был ComboBox, за которым следовало ListBox в StackPanel, а полоса прокрутки ListBox не отображалась. Я решил это, вместо этого поместив их в DockPanel. Я установил ComboBox DockPanel.Dock = "Top" и позволил ListBox заполнить оставшееся пространство.
источник
Прокрутка XAML ListBox - Windows 10 (UWP)
<Style TargetType="ListBox"> <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Visible"/> <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Visible"/> </Style>
источник