如何在WPF4 DataGrid中使用分组在水平滚动期间摆脱显示损坏?

时间:2011-04-12 09:12:44

标签: wpf xaml wpfdatagrid

我正在尝试使用分组创建数据网格,并且在水平滚动期间我得到显示损坏(空白区域)。当定义了GroupStyle.ContainerStyle时,问题会出现 。数据网格应包含200行或更多行来重现问题。

UPDATE2: Related Microsoft Connect feedback

更新 微软在social.msdn.com指出,添加分组会关闭数据网格虚拟化。可能这是问题的根源。我从我的示例中删除了分组,并将VirtualizingStackPanel.IsVirtualizing设置为false并获得了完全相同的损坏。

重现问题的代码:

<DataGrid ItemsSource="{Binding Source={StaticResource ResourceKey=cvsGoods}}"
          CanUserAddRows="False" CanUserReorderColumns="False"
          CanUserDeleteRows="False" CanUserResizeRows="False"
          CanUserSortColumns="False" AutoGenerateColumns="True">
    <DataGrid.GroupStyle>
        <GroupStyle>
            <GroupStyle.ContainerStyle>
                <Style TargetType="{x:Type GroupItem}">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type GroupItem}">
                                <ItemsPresenter  />
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </GroupStyle.ContainerStyle>
        </GroupStyle>
    </DataGrid.GroupStyle>
</DataGrid>

在向左和向左的几个水平滚动后,左侧出现空白区域。我在WinXP和Win7上尝试过它。

问题是:如何摆脱那个bug?有没有解决方法?有什么建议吗?

说明问题的屏幕截图:

Display corruption

3 个答案:

答案 0 :(得分:1)

我们曾遇到过同样的问题(但原因并不相同),即数据网格在某些行的第一列之前会有空白区域。我们当时解决(黑客攻击)的方式是禁用rowheader(不知道它是如何解决问题的,但确实发现空白区域实际上是行标题)。

我们通过将宽度设置为零来禁用(正确的单词将使其大小为零)rowheader,类似下面的代码:

<wpftk:DataGrid>
...
...
<wpftk:DataGrid.RowHeaderStyle>
    <Style  TargetType="wpftk:DataGridRowHeader" >
        <Setter Property="Width" Value="0" />
        <Setter Property="MaxWidth" Value="0" />
    </Style>
</wpftk:DataGrid.RowHeaderStyle>
...
...
</wpftk:DataGrid>

让我知道它是否适用于您的情况。

我们还注意到,如果我们要么禁用虚拟化或者行标题,那么它将解决我们的问题。因为我们不需要它,我们去禁用了行头。

答案 1 :(得分:1)

这是一个黑暗中的镜头,但滚动完成时只需在控件上调用InvalidateVisual()。

此外,既然你说它有大约200行,我们遇到了类似的高负载响应问题。我们能够通过从后台线程更新UI来解决它。您可以在here上阅读更多内容。

答案 2 :(得分:1)

我认为你的groupstyle模板导致了一些剪辑,我尝试加载1000行,它运行正常。这里还有一个问题是尝试在容器中托管标头。在下面的示例中,我使用了TreeViewItem,

                <GroupStyle.ContainerStyle>
                    <Style TargetType="{x:Type GroupItem}">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type GroupItem}">
                                    <TreeViewItem IsExpanded="True">
                                        <TreeViewItem.Header>
                                            <TextBlock Text="{Binding Name}" />
                                        </TreeViewItem.Header>
                                        <ItemsPresenter />
                                    </TreeViewItem>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </GroupStyle.ContainerStyle>

如果有帮助,请告诉我。

-Fahad