C# WPF数据网格响应-20x50单元

C# WPF数据网格响应-20x50单元,c#,wpf,datagrid,C#,Wpf,Datagrid,我们正在努力解决wpf中数据网格的缓慢问题。无论我们使用哪个集合-List、bindingslist、observetecollection、customobservetecollection,当响应集合更新(清除、添加)并在屏幕上呈现时,它仍然非常慢 我们找到的最快解决方案不是更新集合,而是更新集合中DataGrid绑定到的exsting对象。在这种情况下,网格响应非常快,就像旧的winforms网格一样 我们正在网格中创建65535行,这对于我们所有的网格来说已经足够了。在更新网格时,我们更

我们正在努力解决wpf中数据网格的缓慢问题。无论我们使用哪个集合-List、bindingslist、observetecollection、customobservetecollection,当响应集合更新(清除、添加)并在屏幕上呈现时,它仍然非常慢

我们找到的最快解决方案不是更新集合,而是更新集合中DataGrid绑定到的exsting对象。在这种情况下,网格响应非常快,就像旧的winforms网格一样

我们正在网格中创建65535行,这对于我们所有的网格来说已经足够了。在更新网格时,我们更新所需的顶行数,并为其余行设置visibility=hidden。正如我所说,它的工作速度非常快。但有两个问题我们无法解决:

  • 滚动条,因为我们没有折叠行(它很慢)-它总是设置为65535行。有没有办法将滚动或网格大小限制为实际可见行数
  • 另外,我注意到,向集合中添加新行(如果它们不需要立即渲染(它们将超出可见区域)也非常快,因此我们可以将最小设置限制为50行(最大可见行),然后根据需要添加/删除新行。但这并不能解决滚动的问题

    欢迎任何其他解决方案。 预见到启用虚拟化的建议-是的,我们正在使用虚拟化(对于默认启用的行和列)

    更新: 我们试图显示20列x50行数据。如果我们使用Clear()修改源集合,然后使用Add(),则呈现时间大约为1秒,这对我们来说是完全不可接受的,因为UI冻结了一秒钟。我尝试将datagrid的大小调整为0高度,然后在后台线程中以增量方式将大小设置回原位,这会解冻UI,但“忽略”很难看,而且我还没有设法将datagrid设置回原位以填充父控件。似乎在代码中设置了高度之后,就没有回头路了。 正如在最初的文章中一样,我们发现另一种解决方案是不修改集合。只需将网格限制在65535行,不要添加或删除新项目。它的工作速度非常快,但现在我们在同步滚动和排序方面遇到了问题。
    我发现datagrid在WPF中的控制非常令人沮丧。性能低于任何合理限制。 我们正在努力实现的是响应能力。加载数据时,它阻塞UI的时间不应超过几毫秒

    XAML:没什么特别的

    <DataGrid x:Name="TheGrid" 
                              DockPanel.Dock="Top"
                              ItemsSource="{Binding Collection}"  
                              EnableColumnVirtualization="True"
                              EnableRowVirtualization="True"              
                              AutoGenerateColumns="False"
                              ColumnWidth="70"
                              RowHeight="20"
    
                              >
    
    
                        <DataGrid.Columns>
                            <DataGridTemplateColumn Header="Header 1" >
    
                                <DataGridTemplateColumn.CellEditingTemplate>
                                    <DataTemplate>
                                        <TextBox Text="{Binding Field1, Mode=TwoWay}" />
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellEditingTemplate>
    
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <TextBlock Text="{Binding Field1}" /></DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
    
                            </DataGridTemplateColumn >
    
    
    
    。。。。。以此类推,共有20列


    此外,datagrid不在StackPanel中(这使得它的速度非常慢)。

    我发现了一些可能对您有用的页面

    第一个是关于缓存datagrid中的值:

    第二个问题是如何为datagrid实现虚拟模式:

    我希望它能帮助你

    更新:
    您使用的是滚动视图吗?因为如果您是,它将加载所有行,而不是仅可见的行。试着看看这个问题的答案:

    我找到了一些可能对您有用的页面

    第一个是关于缓存datagrid中的值:

    第二个问题是如何为datagrid实现虚拟模式:

    我希望它能帮助你

    更新:
    您使用的是滚动视图吗?因为如果您是,它将加载所有行,而不是仅可见的行。试着看看这个问题的答案:

    我知道这可能不是正确的解决方案,因为它仍然需要相同的时间。但使其成为多线程将解决冻结问题。然后,您可以让它在后台填充网格中的数据,并在运行时逐个添加这些数据,或者在完成后全部添加这些数据。

    我知道这可能不是正确的解决方案,因为它仍然需要相同的时间。但使其成为多线程将解决冻结问题。然后,您可以让它在后台填充网格中的数据,并在运行时逐个添加它们,或者在完成后将它们全部添加。

    最后,我们发现了如何将滚动限制为任意数量的行,而不会进行过多的修改。 我们创建了自己的绑定列表,它实现了ICollection,在ScrollView中用于获取行数。我们将ICollection.Count更改为返回可见行的计数,这是在调用Measure之前设置的,然后将其设置回实际计数。它工作得很好,解决了滚动的所有问题。
    所以,我们有一个网格,它绑定到一个列表,列表中有静态的行数,我们将visibility=Visible设置为要显示的n个第一行,其余的都隐藏了visibility(不折叠,因为折叠非常慢),我们将滚动限制为可见行。列表中的对象可以从不同的线程进行更新,我们不需要调用Dispatcher,因为WPF本身就是这样做的

    最后,我们找到了如何将滚动限制为任意数量的行,而不是进行太多的黑客攻击。 我们创建了自己的绑定列表,它实现了ICollection,在ScrollView中用于获取行数。我们将ICollection.Count更改为返回可见行的计数,这是在调用Measure之前设置的,然后将其设置回实际计数。它工作得很好,解决了滚动的所有问题。 所以,我们有一个网格,它绑定到一个列表,列表中有静态的行数,我们将visibility=Visible设置为要显示的n个第一行,其余的都隐藏了visibility(不折叠,因为折叠非常慢),我们将滚动限制为可见行。列表中的对象可以从不同的线程更新,我们不需要调用Dispatc