我正在使用一个.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。其中几列使用自定义StringFormats,但没有复杂的内容。没有TypeConverters。
Visual Studio性能工具/分析器毫无用处。这似乎是一个相对简单/直接的设置。任何关于如何提高性能的建议都将不胜感激。
我还想知道为什么它会如此缓慢。
只要我让它可见,它基本上运行得很好。如果我去到应用程序中的另一个选项卡,然后几分钟后回来,UI线程会锁定30秒钟(大约有1200行,其中大约40行在屏幕上)。所有的行数据都已经在内存中,所以没有I/O。所有绑定的属性都是简单的字符串、数字或日期,或者创建它们的逻辑非常简单;没有复杂或耗时的计算。
当有几百行以上时,选择一个新的列进行排序非常缓慢。添加新行似乎也很慢。如果我切换到另一个选项卡,然后立即切换回来,网格会快速重新出现。
调整窗口大小的性能表现良好。
滚动性能一开始很慢,但在网格完全加载后变得更好;它从来没有很好。如果不使用ScrollView.CanContentScroll="False",滚动速度太慢了,无法使用。相反,使用IsDeferredScrollingEnabled="True"会导致用户放开滚动条后渲染延迟10多秒,这仍然是一个无法接受的用户体验。
有17个DataGridTextColumns。其中几列使用自定义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>