代码虽然不是特别需要。
<StackPanel>
<Button Click="ButtonBase_OnClick" Content="add item" />
<ListBox ItemsSource="{Binding RectangleList}">
<ListBox.ItemTemplate>
<DataTemplate>
<Rectangle Width="50"
Height="50"
Margin="10"
Fill="Blue" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
如果什么都没有改变,那么 ListBox 将不会滚动,即使它超出了屏幕。在英语中,假设 StackPanel 被拉伸以便一切都适合它,因为没有限制。
但是高度限制很奇怪。
如果 ListBox 设置了 Height,则当超过 Height 时将出现 ScrollBar。
但是,如果您设置 StackPanel 的高度,则内容将被截断并且 ListBox 将超出可见范围,但 ScrollBar 不会。
如果将 StackPanel 替换为 Grid,则 ListBox 会将 Grid 和父 Window 拉到屏幕上,但随后仍会出现令人垂涎的滚动条。
为什么 LisBox 会忽略 StackPanel 的高度?这是一个错误还是我遗漏了一些关于它是如何计算的?
事实上,像
StackPanel
它们自己这样的布局面板会放置它们的子元素,解决它们的位置和(部分)大小问题。计算子元素的所需大小是通过调用 来完成的child.Measure
,它将可用大小作为输入。根据文档,
StackPanel
在计算子元素的大小/位置时,它认为可用高度(水平情况下的宽度)是无限的。证明文本(“StackPanel vs. DockPanel”部分):也就是说,在这一步中,
MeasureOverride
子元素在垂直方向上被赋予无限的可用尺寸。这意味着ListBox
它将获得尽可能多的空间,因此不会显示滚动条。您可以在源代码中看到相同的内容:
堆栈.cs/565:
Stack.cs/583:
可以看出子元素得到了一个垂直无限槽来测量自己。
看起来您可以从 中获得您想要的行为
DockPanel
。