4

我正在使用 .NET 4.0 WPF DataGrid,绑定到ObservableCollection<T>. 该集合每秒添加和删除几次行。DataGrid包含在/ TabControl/TabItemGrid

只要我让它可见,它或多或少都可以工作。如果我转到应用程序中的其他选项卡,然后在几分钟后返回,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>
4

2 回答 2

4

删除ScrollViewer.CanContentScroll = "False". 它将禁用 WPF DataGrid 的默认 UI 虚拟化支持。

请参阅此处的答案Physical scrolling disable UI Virtualization

从答案 -

“ScrollViewer 目前允许两种滚动模式:平滑逐像素滚动 (CanContentScroll = false) 或离散逐项滚动 (CanContentScroll = true)。目前 WPF 仅在逐项滚动时支持 UI 虚拟化。基于像素的滚动是也称为“物理滚动”,基于项目的滚动也称为“逻辑滚动”。”

更新

如果您希望在拖动滚动条时平滑操作,可以将其设置IsDeferredScrollingEnabledtrue。它将使视图中的项目仅在您释放滚动条拇指后才呈现,而不是在拖动操作期间创建所有项目。

<DataGrid ScrollViewer.IsDeferredScrollingEnabled="True"/>

此外,来自MSDN的此链接可能会对您有所帮助。

于 2012-11-24T13:33:55.407 回答
0

我建议您在选项卡项之间切换时调查非持久选项卡项状态的 TabControl 问题。

TABCONTROL具有特定的行为 - 当Tab项目未被选中时,其内容被破坏,并且必须在选择选项卡项目再次选择时重新创建它,这意味着必须重新创建整个DataGrid及其所有可见数据杂志。

只是谷歌“在 WPF TabControl 中保持视觉树”或“在 WPF TabControl 中保持状态”。

于 2012-12-02T20:24:50.023 回答