DataGrid
にバインドされた .NET 4.0 WPF を使用していますObservableCollection<T>
。コレクションには、1 秒間に数回、行が追加および削除されています。は/ /DataGrid
に含まれています。TabControl
TabItem
Grid
表示したままにしておく限り、多かれ少なかれ問題なく動作します。アプリの別のタブに移動し、数分後に戻ると、UI スレッドが 30 秒間ロックされます (合計約 1200 行で、そのうち約 40 行が画面に表示されます)。すべての行データは既にメモリ内にあるため、I/O はありません。すべてのバインドされたプロパティは単純な文字列、数値、または日付のいずれかであるか、それらを作成するロジックは非常に単純です。計算に複雑なことや時間のかかることは何もありません。
行数が数百を超える場合、並べ替える新しい列を選択するのに非常に時間がかかります。新しい行の追加も遅いようです。別のタブに切り替えてからすぐに戻ると、グリッドがすぐに再表示されます。
ウィンドウのサイズ変更は正常に実行されます。
スクロールのパフォーマンスは最初は遅いですが、グリッドが完全に読み込まれると取得します。それは決して素晴らしいことではありません。がないScrollView.CanContentScroll="False"
と、スクロールが遅くて使い物になりません。代わりに使用IsDeferredScrollingEnabled="True"
すると、ユーザーがスクロールバーを離した後、レンダリングで 10 秒以上の遅延が発生します。これは、依然として許容できないユーザー エクスペリエンスです。
17 あり ますDataGridTextColumns
。列のいくつかは customStringFormats
を使用していますが、複雑なことは何もありません。いいえ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>