DataGrid with ScrollViewer inside an Expander and ItemsContr



我有一个 ItemsControl,在扩展器中有一个 DataGrid 作为 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>

我希望每个数据网格都有一个 ScrollViewer,如果扩展器太多,则有一个用于扩展器列表的滚动查看器。我的问题是,它只有在设置数据网格的 MaxHeight 属性时才有效。这很烦人,因为例如,如果 ItemsControl 中只有一个条目,则该条目不会占用整个空间,因为它的高度有限。

有人有想法吗?

嗯,很难理解你在做什么,但这可能会帮助你走得更远。

问题是滚动查看器。让我向您展示 ScrollViewer 在 WPF 中的作用。

它的默认行为是在用户是否希望使用滚动条之间切换。

如果用户没有设置任何首选项,ScrollViewer将尝试使用滚动条。因此,ScrollViewer 将无穷大作为值传递给其子项,以允许其子项占用任意数量的空间。与您的情况一样,最终结果是当一个项目仅存在时,它不会填满所有可用空间,因为 ScrollViewer 允许它以所需的大小(小于可用大小)排列。基本上换句话说,ScrollViewer对孩子们说,我不在乎,你选择你想要的尺寸,然后按照你想要的尺寸排列自己。我将只显示滚动条,以便用户可以滚动到您。ScrollViewer非常愚蠢。

为了接收完整填充空间行为,您必须告诉 ScrollViewer 禁用滚动条。然后,ScrollViewer 不会将无穷大作为度量值传递给其子项,而是传递窗口/可用空间的大小。孩子们会注意到有一个固定的宽度和高度(而不是无穷大),并将测量自己以填满给定的空间。(意味着孩子想要的大小将是窗口大小或可用 spcae 的大小,而不是他们想要的大小。无论如何,他们希望的那个都小于可用空间)

综上所述。当您有一个项目时,只需禁用滚动条或根本不使用滚动查看器。将 ScrollViewer 排除在外,让 Expander 成为 Grid 的下一个节点。扩展器将使用完整的可用空间。虽然当你注意到你向你的项目来源添加了新项目时,你只需交换模板并在扩展器周围使用滚动查看器,允许你滚动。

我希望我至少给了你一个想法,如何使一件物品采用完整的尺寸。

最新更新