我正在使用绑定到DataGrid
的.NET 4.0 WPF ObservableCollection<T>
。该集合每秒添加和删除几行。 DataGrid
包含在TabControl
/ TabItem
/ Grid
中。
只要我让它可见,它的效果或多或少都可以。如果我转到应用程序中的其他选项卡,然后几分钟后返回,UI线程会锁定30秒(总共约1200行,其中大约40个在屏幕上)。所有行数据都已在内存中,因此没有I / O.所有绑定属性都是简单的字符串,数字或日期,或者创建它们的逻辑非常简单;没有什么复杂或耗时的计算。
当行数超过几百行时,选择要排序的新列非常慢。添加新行似乎也很慢。如果我切换到另一个选项卡然后再向后切换,则网格会快速重新出现。
调整窗口大小可以正常运行。
滚动性能最初很慢,但在网格完全加载后得到;它永远不会伟大。没有ScrollView.CanContentScroll="False"
,滚动速度太慢,无法使用。在用户放开滚动条后,使用IsDeferredScrollingEnabled="True"
会导致渲染延迟10秒以上 - 仍然是一种无法接受的用户体验。
有17 DataGridTextColumns
。有些列使用自定义StringFormats
,但并不复杂。否TypeConverters
。
Visual Studio性能工具/分析器一直没用。这似乎是一个相对简单/直接的设置。任何有关如何提高性能的建议都将受到赞赏。
我也想知道为什么 SO 慢。
<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>
答案 0 :(得分:4)
删除ScrollViewer.CanContentScroll = "False"
。它将禁用WPF DataGrid的默认UI Virtualization支持。
请参阅此处的答案Physical scrolling disable UI Virtualization。
从答案 -
&#34; ScrollViewer目前允许两种滚动模式:平滑 逐像素滚动(CanContentScroll = false)或离散 逐项滚动(CanContentScroll = true)。目前WPF 仅在按项目滚动时支持UI虚拟化。基于像素的 滚动也称为“物理滚动”和基于项目的滚动 也被称为“逻辑滚动”。&#34;
<强>更新强>
如果您希望在拖动滚动条时进行平滑操作,可以将IsDeferredScrollingEnabled
设置为true
。只有在您释放滚动条滑块时,它才会使视图中的项目呈现,而不是在拖动操作期间创建所有项目。
<DataGrid ScrollViewer.IsDeferredScrollingEnabled="True"/>
此外,来自MSDN的此链接可能对您有帮助。
答案 1 :(得分:0)
我建议您在选项卡项之间切换时调查非持久标签项状态的TabControl问题。
TabControl具有特定的行为 - 当选项卡项未被选中时,其内容将被销毁,并且必须在再次选择选项卡项时重新创建它,这意味着必须重新创建整个DataGrid及其所有可见的DataGridCell。
只是谷歌“WPF TabControl中的持久视觉树”或“WPF TabControl中的持久状态”。