【问题标题】:DataGrid with ScrollViewer inside an Expander and ItemsControl在 Expander 和 ItemsControl 内带有 ScrollViewer 的 DataGrid
【发布时间】:2013-10-21 08:21:49
【问题描述】:

我有一个 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,如果扩展器列表太多,我希望有一个 ScrollViewer。我的问题是它只有在我设置 DataGrid 的 MaxHeight 属性时才有效。这很烦人,因为如果有例如ItemsControl 中只有一个条目,该条目没有使用整个空间,因为它的高度是有限的。

有人有想法吗?

【问题讨论】:

  • 如果您不通过Height 属性告诉它,您如何期望内部ScrollViewers 知道何时添加滚动条? Expander 将允许它像其他情况一样增长。
  • 这就是我问的原因。我不知道方法,但也许其他人做到了。当只有一个条目时,考虑一种计算 MaxHeight 的行为。但也许这有点尴尬。
  • 好吧,让我换个说法……如果你不告诉他们何时通过设置Height(或@987654327),内部ScrollViewers 将不知道何时添加滚动条@ 或 MinHeight) 属性。
  • 我明白这一点。我提到当用户调整应用程序大小或 ItemsControl 中只有一个条目时,通过行为原因计算 MaxHeight 可能有一些未使用的空白。这就是我考虑行为的原因:计算 MaxHeight;取决于外部网格的高度。

标签: wpf xaml datagrid expander


【解决方案1】:

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

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

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

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

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

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

我希望我至少让您知道如何使一件物品具有完整的尺寸。

【讨论】:

  • 感谢您的信息。但是,如果我删除外部 ScrollViewer,则 DataGrid 不会显示 ScrollViewer。只有当我设置例如DataGrid-MaxHeight DataGrid-ScrollViewer 将被启用。
  • 我说的是最上面的ScrollViewer。什么是 DataGrid-ScrollViewer?内置的?
  • 是的,内置。对不起,应该这么说。但是你有两个模板的想法很好。因此,当拥有多个扩展器时,我将设置 MaxHeight。但是我仍然需要一个没有最高扩展器且只有 DataGrid 内置的扩展器的解决方案。
  • 嗯,好的。您必须考虑 Expander 与 ScrollViewer 几乎相同,但滚动条除外。 Expander 不会将完整的窗口大小传递给 DataGrid。它传递无穷大,指示 DataGrid 以所需的大小而不是完整的可用大小来排列自己。当 Expander 展开时,它将使用 DataGrid 的所需大小。你必须告诉它使用 Window 的大小。所以也许一个模板是单独的 DataGrid,另一个是扩展器的 ListBox。但使用 ListBox 而不是 ItemsControl。
  • 啊,该死的...忘记了扩展器的行为...thx :) 为什么 ListBox 而没有 ItemsControl?真的很喜欢 ItemsControl,因为我不需要选择。
猜你喜欢
  • 1970-01-01
  • 2011-01-02
  • 2018-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-15
  • 1970-01-01
相关资源
最近更新 更多