我在Expander中有一个带有DataGrid的ItemsControl作为ItemTemplate。
<Grid>
<ScrollViewer HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Auto">
<ItemsControl ItemsSource="{Binding SomeItemSource}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Expander>
<Grid>
<DataGrid ItemsSource="{Binding SomeItemSource}"
ScrollViewer.CanContentScroll="True"
ScrollViewer.VerticalScrollBarVisibility="Auto"
ScrollViewer.HorizontalScrollBarVisibility="Auto"
MaxHeight="200">
</DataGrid>
</Grid>
</Expander>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</Grid>
我希望每个DataGrid都有一个ScrollViewer,如果它们太多,我想要一个扩展器列表。我的问题是它只有在我设置DataGrid的MaxHeight属性时才有效。这很烦人,因为如果有例如在ItemsControl中,只有一个条目没有使用整个空间,因为它的高度是有限的。
有没有人有想法?
答案 0 :(得分:0)
嗯,很难理解你的情况,但这可能会对你有所帮助。
问题是ScrollViewer。让我向您展示ScrollViewer在WPF中的作用。
它的默认行为是在用户是否希望拥有ScrollBars之间切换。
如果用户没有设置任何首选项,ScrollViewer将尝试使用ScrollBars。因此,ScrollViewer将无限值作为值传递给其子节点,以允许其子节点占用尽可能多的空间。在您的情况下,最终结果是当一个项目仅在那里时它没有满足所有可用空间,因为ScrollViewer允许它以所需大小(小于可用大小)排列。基本上换句话说ScrollViewer对孩子们说meehhh我不在乎,你选择你想要的尺寸并按照你想要的尺寸安排自己。我将只显示ScrollBars,以便用户可以滚动到您。 ScrollViewer非常愚蠢。
为了接收fullfill空间行为,您必须告诉ScrollViewer禁用ScrollBar。然后,ScrollViewer不会将无穷大作为度量值传递给其子项,而是会传递窗口/可用空间的大小。孩子们会注意到固定的宽度和高度在那里(而不是无限远)并且会测量自己以满足给定的空间。 (意味着儿童所需的尺寸将是窗户尺寸或可用的尺寸,而不是他们希望的尺寸。他们希望的那个小于可用的空间)
总结一下。当你有一个项目时,只需禁用ScrollBars或根本不使用ScrollViewer。离开ScrollViewer,让Expander成为Grid的下一个节点。 Expander将使用完整的可用空间。虽然当您注意到您向ItemsSource添加了新项目时,您只需交换模板并使用ScrollViewer围绕Expanders进行滚动。
我希望我至少能告诉你如何让一件物品占据完整的尺寸。