我正在使用 .NET 4.0 WPF DataGrid
,绑定到ObservableCollection<T>
. 该集合每秒添加和删除几次行。DataGrid
包含在/ TabControl
/TabItem
中Grid
。
只要我让它可见,它或多或少都可以工作。如果我转到应用程序中的其他选项卡,然后在几分钟后返回,UI 线程会锁定 30 秒(总共大约 1200 行,其中大约 40 行在屏幕上)。所有行数据都已经在内存中,所以没有 I/O。所有绑定的属性要么是简单的字符串、数字或日期,要么创建它们的逻辑非常简单;没有什么复杂或耗时的计算。
当有超过几百行时,选择一个新的列进行排序是很慢的。添加新行似乎也很慢。如果我切换到另一个选项卡,然后立即切换回来,网格会很快重新出现。
调整窗口大小可以正常工作。
滚动性能一开始很慢,但在网格完全加载后得到;它从来都不是很好。没有ScrollView.CanContentScroll="False"
,滚动速度太慢以至于无法使用。相反,在用户放开滚动条后,使用IsDeferredScrollingEnabled="True"
它会导致渲染延迟 10 秒以上——这仍然是一种不可接受的用户体验。
有 17 个DataGridTextColumns
。有几个列使用 custom StringFormats
,但并不复杂。没有TypeConverters
。
Visual Studio 性能工具/分析器一直没用。这似乎是一个相对简单/直接的设置。任何有关如何提高性能的建议将不胜感激。
我也想知道为什么这么慢。
<DataGrid x:Name="MyGrid" AutoGenerateColumns="False" Margin="3,35,3,20" VerticalContentAlignment="Center" Width="Auto"
FontSize="12" FontFamily="Consolas" ScrollViewer.CanContentScroll="False"
CanUserResizeRows="False" AlternationCount="2" AlternatingRowBackground="#FFE3F0FF"
VirtualizingStackPanel.VirtualizationMode="Recycling" IsReadOnly="True">
<DataGrid.Columns>
<DataGridTextColumn Header="XX" Binding="{Binding Path=XX}" />
<DataGridTextColumn Header="YY" Binding="{Binding Path=YY, StringFormat={}{0:0.0}}">
<DataGridTextColumn.ElementStyle>
<Style>
<Setter Property="TextBlock.TextAlignment" Value="Right" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
. . .
</DataGrid.Columns>
</DataGrid>