【问题标题】:Extra space below rows that appears when scrolling to the bottom of a DataGrid?滚动到 DataGrid 底部时出现的行下方的额外空间?
【发布时间】:2011-11-27 23:14:59
【问题描述】:

好的,所以我有一个带有 CanUserAddRows=false 的 DataGrid(标准 WPF DataGrid,.Net 4.0 附带,而不是 WPF Toolkit DataGrid)。它绑定到 ViewModel 中的 ObservableCollection。它有一个正确设置的 MaxHeight,因此如果屏幕上的行太多,它会滚动。

它工作得很好,除了如果用户将鼠标放在 DataGrid 上然后向下移动滚轮,那么行下方会出现一些额外的空间:

我宁愿在这种情况下不出现灰色空间(无需滚动)。我该如何做到这一点?

附:由于我们程序的一些特殊要求,我实际上已经为DataGrid 底部的新行构建了自己的功能,因此DataGrid 底部的空白行。完全是在虚拟机中完成的,所以应该不会影响这个问题的答案。

更新:

这种行为发生在我目前拥有的每个DataGrid 上。但是,当在DataGrid 上设置了 MaxHeight,并且行数超过了可以显示的行数时,内容就会开始滚动。在这种情况下,线条下方的灰色空间的大小是可变的。也就是说,由于DataGrid基于内容滚动而不是物理滚动(请参阅this for details关于差异,在备注部分下),当您一直滚动时,最后一行下方的底部会有一点额外的空间至底部。灰色空间填补了额外的空间。这是一个例子:

为了澄清,我不太介意这种行为,只是在不需要滚动时出现灰色空间。我只是认为这种行为有助于指出问题的原因。

更新 #2:

我发现了可能导致问题的原因:如果将 EnableRowVirtualization 设置为 false,则会出现此问题。 但是,如果我想将其设置为false,如何防止在不需要滚动时出现灰色空间/“额外线”?(这是我的主要关注点和要点这个问题)

【问题讨论】:

  • 它实际上发生在我家里的机器上,而不是我工作的机器上。很高兴我不是唯一一个看到这个的人?
  • 嗯。我注意到它有点反复无常......虽然我通常可以最终实现它。不完全确定它取决于什么......
  • 如果您尝试将数据网格设置为只读会怎样。那么它还在发生吗?
  • 嗯...经过快速测试 - 是的,当我为 DataGrid 设置 IsReadOnly="True" 时,它仍然会发生。在这种情况下,这意味着什么?设置该属性后,我仍然可以编辑 DataGrid。
  • 我会尝试创建一个简单的List 并将其分配给ItemsSource。只是为了完全确保这与 ViewModel 及其修改(也许,异步和其他东西)无关。

标签: wpf mvvm datagrid


【解决方案1】:

试试这个:设置

  • ScrollViewer.CanContentScrollFalse
  • ScrollViewer.HorizontalScrollBarVisibilityDisabled

然后

<DataGrid x:Name="myDataGrid"
          RowHeaderWidth="{Binding RelativeSource={RelativeSource Self}, Path=RowHeight}"
          ScrollViewer.CanContentScroll="False" 
          ScrollViewer.HorizontalScrollBarVisibility="Disabled">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Name" Width="*" Binding="{Binding Name}"/>
        <DataGridTextColumn Header="Age" Width="*" Binding="{Binding Age}"/>
    </DataGrid.Columns>
</DataGrid>

【讨论】:

    【解决方案2】:

    我也遇到过同样的问题。在我的情况下,底部的额外空间是因为 MaxHeight 被设置并且是因为

    VirtualizingPanel.ScrollUnit="Item"
    

    设置后

    VirtualizingPanel.ScrollUnit="Pixel"
    

    问题实际上消失了(仍然有 MaxHeight 属性)

    【讨论】:

      【解决方案3】:

      你的问题有点不清楚,但我可以提供一些调查步骤来找出原因。

      1. 确保您的可观察集合不包含任何空值。集合中的空条目仍将在网格中显示为空白行。

      2. 它发生在不同环境中的事实意味着您的数据源可能不同,因此这是一个检查的好地方。此处检查集合的计数是否与网格上的行数(包括空行)直接匹配。

      3. 确保这不是控件模板问题。如果可能,请查看DataGrid 控件的StyleDataTemplate,看看这是否不是视觉副作用。

      除此之外,您应该在问题中包含更多详细信息,例如您正在使用的DataGrid 的类型(例如 WPF Toolkit、Telerik、DevExpress 等),以便我们排除模板问题。

      【讨论】:

      • 我已经澄清了这个问题,包括我一开始使用的 DataGrid 的一些细节。我正在使用 WPF .Net 4 DataGrid(不是 WPF Toolkit DataGrid,我理解它略有不同)。可观察集合中显然没有空值。集合的计数直接与行数匹配(不包括灰色空间,我不相信这是一个空行)。 DataTemplate 是 Microsoft 的标准模板——没有任何明显的错误。希望有帮助。谢谢!
      【解决方案4】:

      我遇到了同样的问题,这是由DataGridMaxHeight 属性未设置为行大小的倍数引起的,因此剩余空间显示在DataGrid 的底部.例如:如果有 5 行高度为 10 像素,并且 MaxHeight 属性设置为 55,那么底部将有 5 像素的空间。

      【讨论】:

      • 其实:[dataGridMaxHeight - headerRowHeight % rowHeight == 0]。这应该是公认的答案。解决方法其实很简单,但是你的帖子对我帮助很大,谢谢。
      • 我也面临同样的问题。 DataGrid 中有太多未使用的空间。
      【解决方案5】:

      我猜这可能是因为 DataGrid 必须在行边界显示第一行 visible 行,例如它不能只显示第一个可见行的下半部分,以使最后一行与控件的底部对齐。

      您可以通过两个步骤进行测试: 1) 滚动到 DataGrid 的底部,查看额外的灰色空间; 2) 慢慢垂直调整 DataGrid(或其包含的窗口)的大小,并查看灰色空间如何变化,同时注意第一个可见行保持不动。

      【讨论】:

        【解决方案6】:

        我遇到了类似的问题,答案很简单。 您所要做的就是将以下内容放入 XAML 中的数据网格定义中:

        <DataGrid AutoGenerateColumns="False"  ItemsSource="{Binding ItemList}"
        CanUserAddRows="false"
        

        你很清楚。

        另一个类似的东西是,如果您在数据网格中得到一个空白列,那么解决方案是将 Width="*" 放在最后一个列定义中,也在 XAML 中。

        希望对你有用。

        【讨论】:

        • -1:作者已经明确指出他/她已经有CanUserAddRows="false"
        【解决方案7】:
        Set ScrollViewer.CanContentScroll="False" & ScrollViewer.HorizontalScrollBarVisibility="Disabled" in DataGrid.
        

        【讨论】:

          【解决方案8】:

          ScrollViewer.CanContentScrollCanUserAddRows 都设置为false

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-04-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-08-10
            相关资源
            最近更新 更多