1

我有一个 ItemsControl,在 Expander 内有一个 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>

我想为每个 DataGrid 设置一个 ScrollViewer,如果扩展器列表太多,我想为扩展器列表设置一个。我的问题是它只有在我设置 DataGrid 的 MaxHeight 属性时才有效。这很烦人,因为如果 ItemsControl 中只有一个条目,则该条目不会使用整个空间,因为它的高度是有限的。

有人有想法吗?

4

1 回答 1

0

嗯,很难理解你在做什么,但这可能会帮助你进一步。

问题是 ScrollViewer。让我向您展示 ScrollViewer 在 WPF 中的作用。

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

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

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

总结一下。当您拥有一项时,只需禁用 ScrollBars 或根本不使用 ScrollViewer。将 ScrollViewer 排除在外,让 Expander 成为 Grid 的下一个节点。Expander 将使用完整的可用空间。虽然当您注意到您向 ItemsSource 添加了新项目时,您只需交换模板并在 Expanders 周围使用 ScrollViewer 允许您滚动。

我希望我至少给了你一个想法,让你知道如何使一件物品具有完整的尺寸。

于 2013-10-21T09:28:43.173 回答