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

时间:2011-09-29 19:10:22

标签: wpf mvvm datagrid

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

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

Strange DataGrid

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

P.S。由于我们程序的一些特殊要求,我实际上为DataGrid底部的新行构建了自己的功能,因此DataGrid底部的空白行。它完全在VM中完成,所以它不应该影响这个问题的答案。

更新

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

Strange DataGrid Behavior 2

为了澄清,我不介意那么多的行为,只是当不需要滚动时出现灰色空间。我只是认为这种行为有助于表明问题的原因。

更新#2:

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

8 个答案:

答案 0 :(得分:1)

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

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

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

试试这个:设置

  • 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>

答案 4 :(得分:0)

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

VirtualizingPanel.ScrollUnit="Item"

设置为

VirtualizingPanel.ScrollUnit="Pixel"

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

答案 5 :(得分:-1)

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

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

你很清楚。

另一个类似的问题是,如果您的数据网格中有一个空白列,那么解决方案是将Width =“*”放在XAML中的最后一列定义中。

希望对你有用。

答案 6 :(得分:-1)

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

答案 7 :(得分:-1)

ScrollViewer.CanContentScrollCanUserAddRows都设置为false