在Expander和ItemsControl中使用ScrollViewer的DataGrid

时间:2013-10-21 08:21:50

标签: wpf xaml datagrid expander

我在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中,只有一个条目没有使用整个空间,因为它的高度是有限的。

有没有人有想法?

1 个答案:

答案 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进行滚动。

我希望我至少能告诉你如何让一件物品占据完整的尺寸。