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