隐藏后,WPF DataGrid缓慢刷新

时间:2012-11-24 13:18:53

标签: wpf performance datagrid

我正在使用绑定到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>

2 个答案:

答案 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中的持久状态”。