DataGrid滚动到底部时出现的行下面的额外空白?

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

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

Strange DataGrid

我希望在这种情况下(无需滚动),灰色空间不会出现。我该如何实现?
附注:由于我们程序的一些特殊要求,我实际上已经为DataGrid底部的新行构建了自己的功能,因此DataGrid底部有一个空白行。它完全在VM中完成,因此不应影响此问题的答案。
更新:
这种行为发生在我目前拥有的每个 DataGrid 上。但是,当设置了 DataGrid 的 MaxHeight,并且有更多的行无法显示时,内容开始滚动。在这种情况下,行下面的灰色空间大小是可变的。也就是说,由于 DataGrid 基于内容而不是物理滚动进行滚动(有关差异的详细信息,请参见 this for details 中的备注部分),因此当您滚动到底部时,最后一行下方会有一点额外的空间。灰色空间填充了该额外空间。以下是一个示例:

Strange DataGrid Behavior 2

为了澄清,我并不介意那种行为,只是当没有滚动的必要时出现灰色空间时才会感到不满。我只是认为这种行为会帮助指示问题的原因。
更新#2:
我发现了什么可以导致这个问题:如果将EnableRowVirtualization设置为false,则会出现这个问题。然而,如果我想将其设置为false,如何防止在没有滚动的情况下出现灰色空间/“额外行”?(这是我的主要关注点和这个问题的主要内容)

这个问题在我家的电脑上确实出现了,但是在我工作的电脑上却没有。你也看到这个问题了,我很高兴我不是唯一一个遇到这个问题的人吗? - MBen
嗯,我注意到它有点善变...虽然我通常最终可以让它发生。不太确定它取决于什么... - skybluecodeflier
如果您尝试将数据网格设置为只读,那么情况会如何?它仍然会发生吗? - 7heViking
嗯... 经过快速测试-是的,当我为DataGrid设置IsReadOnly="True"时,它仍然发生。在这种情况下这意味着什么?即使我设置了该属性,我仍然可以编辑DataGrid。 - skybluecodeflier
我建议创建一个简单的List并将其分配给ItemsSource。只是为了确保这与ViewModel及其修改无关(可能是异步和其他东西)。 - Pavel Gatilov
显示剩余2条评论
8个回答

4
我曾经遇到过同样的问题。在我的情况下,底部的额外空间是因为设置了MaxHeight,并且由于

标签未正确闭合导致的。
VirtualizingPanel.ScrollUnit="Item"

将其设置为之后

VirtualizingPanel.ScrollUnit="Pixel"

实际上问题已经消失了(仍具有MaxHeight属性)


3
尝试这样做:设置
  • 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>

1
我曾经遇到过同样的问题,这是由于 DataGridMaxHeight 属性未设置为行高的倍数所导致,因此剩余的空间会显示在 DataGrid 的底部。例如:如果有 5 行,每行高度为 10 像素,而 MaxHeight 属性设置为 55,则底部会有 5 像素的空间。

实际上:[ dataGridMaxHeight - headerRowHeight % rowHeight == 0 ]。这应该是被接受的答案。解决方案实际上非常简单,但你的帖子对我帮助很大,谢谢。 - rvnlord
我也遇到了同样的问题。DataGrid 中有太多未使用的空间。 - Apoorv

1

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

  1. 确保您的可观察集合中没有任何空值。集合中的空条目仍会显示在网格中作为空行。

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

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

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


我已经澄清了问题,并在开头包含了一些关于我使用的DataGrid的细节。我正在使用WPF .Net 4 DataGrid(而不是我理解的WPF Toolkit DataGrid,它略有不同)。可观察集合中显然没有空值。集合的计数直接与行数匹配(不包括灰色空间,我不确定它是否为空行)。DataTemplate是来自Microsoft的标准模板-没有明显的错误。希望这可以帮助。谢谢! - skybluecodeflier

0

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

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


-1
Set ScrollViewer.CanContentScroll="False" & ScrollViewer.HorizontalScrollBarVisibility="Disabled" in DataGrid.

-1
我曾经遇到过类似的问题,答案很简单。 你只需要在XAML中的datagrid定义中加入以下内容即可:
<DataGrid AutoGenerateColumns="False"  ItemsSource="{Binding ItemList}"
CanUserAddRows="false"

而且你很清楚。

另一个类似的问题是,如果在数据网格中获得了一个空列,则解决方案是在XAML中在最后一列定义中也放置Width =“*”。

希望对您有帮助。


-1:作者已经明确指出他/她已经设置了 CanUserAddRows="false" - Pavel Gatilov

-1

ScrollViewer.CanContentScrollCanUserAddRows都设置为false


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接