在下面的示例中,我有一个包含许多字体名称的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>
答案 0 :(得分:135)
您的解决方案的问题是您在ListBox周围放置一个滚动条,您可能希望将其放在ListBox中。
如果要在ListBox中强制滚动条,请使用ScrollBar.VerticalScrollBarVisibility附加属性。
<ListBox
ItemsSource="{Binding}"
ScrollViewer.VerticalScrollBarVisibility="Visible">
</ListBox>
将此值设置为“自动”将根据需要弹出滚动条。
答案 1 :(得分:25)
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
会展开以容纳其直接子{{1}这样,孩子可以扩展以容纳其孩子(Grid
)。
如果您在任何点限制高度 - 通过设置ListBox
的高度,设置内部ListBox
的高度,或者只是将外部容器设为Grid
- 只要有太多列表项适合控件,就会自动出现垂直滚动条。
答案 2 :(得分:17)
我在ListBox中添加了一个“Height”,它很好地添加了滚动条。
答案 3 :(得分:3)
滚动条会自动添加到“列表”框中,除非其可见性设置为“隐藏”。每当列表项的大小超过一个,可以在列表框内显示垂直或水平列表框在运行时可以看到。
答案 4 :(得分:1)
在我的情况下,ListBox中的项目数是动态的,所以我不想使用Height属性。我使用了MaxHeight而且效果很好。滚动条填满我为其分配的空间时会出现。
答案 5 :(得分:0)
我遇到了同样的问题,我在StackPanel中有一个ComboBox后跟一个ListBox,并且没有显示ListBox的滚动条。我通过将两个放在DockPanel中来解决这个问题。我设置了ComboBox DockPanel.Dock =“Top”并让ListBox填充剩余的空间。
答案 6 :(得分:0)
XAML ListBox滚轮 - Windows 10(UWP)
<Style TargetType="ListBox">
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Visible"/>
<Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Visible"/>
</Style>