WPF数据网格的渲染速度非常慢。

46

我曾尝试使用自定义的 DataGrid,也试过 WPF 自带的 DataGrid。无论是手动填充还是通过绑定数据,两种情况下都很慢。

我的场景是用户点击按钮后,会出现一个包含相应数据的 DataGrid。目前我处于概念验证模式,只使用示例数据。我有一个包含 10 行数据的表格 DataSet。

如果我在点击按钮时不将任何数据附加到 DataGrid 上,则空的 DataGrid 几乎瞬间显示,用户无法察觉到延迟。但是一旦添加了10行具有6个列的数据,延迟就会约为2秒钟,对用户来说非常明显。

我甚至试图填充空数据,只是为了让空的网格出现,但速度同样很慢。

for (int i = 0; i < 10; i++)
    _dataGrid.Items.Add("");

我在点击按钮后设置了一个计时器来计算从点击到执行所有代码以绘制DataGrid所需的时间,大约为20毫秒,因此代码执行非常快,但是屏幕上存在很大的延迟。我尝试了GridView,它在屏幕上呈现得更快。

我听说过在复杂场景下使用1000多行时DataGrid绘制速度慢的各种报道,但这是最简单的情况,只有6列和10行填充了空数据。

对于只读显示,GridView是否与DataGrid具有同样可行性?


更新:

以下是我的列的创建方式。

                DataGridTextColumn column = new DataGridTextColumn();
                column.ColumnWidthChanged += new ColumnWidthChangedEventHandler(column_ColumnWidthChanged);

                column.Header = entity.GetPropertyValue("ColumnLabel");
                column.Binding = new Binding(entity.GetPropertyValue("Tag"));
                column.Width = new DataGridLength(entity.GetPropertyDouble("DisplaySize"));
                _dataGrid.Columns.Add(column);

以下是我如何绑定含有10行数据的DataSet。

                _dataGrid.ItemsSource = ds.Tables[0].DefaultView;
                _dataGrid.DataContext = ds.Tables[0];

我不确定我能做些什么不同的事情。


我也在另一个系统上尝试过该应用,但速度同样很慢。问题在于一些视图上有多个 DataGrid,因此每增加一个 DataGrid,延迟时间就会相应增加。 - David Gunther
我使用标准的WPF DataGrid,具有动态列和超过10000行,并且没有任何问题。你的ItemSource是什么?是DataTable还是某种集合?希望你没有像你发布的那样使用foreach添加项? - blindmeis
我尝试了与帖子中相同的for循环,只是为了看看它是否会有所不同,我不确定绑定是否是问题所在。在实际情况中,我有一个要绑定的DataSet。我将更新帖子。 - David Gunther
1
非常相关:https://dev59.com/LHRB5IYBdhLWcg3wLUu3#7413000 - Robert Harvey
我目前也遇到了同样的问题,代码执行得非常快,但UI更新需要6分钟(我的DataGrid有超过60k个项目)。其他评论似乎都没有帮助,你设法解决了吗? - Raya
11个回答

0

如果您有如下的行定义:

 <Grid.RowDefinitions>
        <RowDefinition x:Name="topRow" Height="*"/>
        <RowDefinition x:Name="mainRow" Height="*"/>
        <RowDefinition x:Name="dataGridRow" Height="*"/>
    </Grid.RowDefinitions>

你必须小心!比如说,如果你的数据网格在其中一行中,那么它将会被重复调整大小。如果你有1000行,那么你的数据网格将会被调整大小1000次!

假设你的数据网格在第三个行定义中,我建议你按照以下方式更改代码。

     <Grid.RowDefinitions>
        <RowDefinition x:Name="topRow" Height="*"/>
        <RowDefinition x:Name="mainRow" Height="*"/>
        <RowDefinition x:Name="dataGridRow" Height="400"/>
    </Grid.RowDefinitions>

当然,您也可以根据需要更改“400”。


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