1

WPFウィンドウにグリッドがあり、内部にDataGridコントロールがあります。

<Grid>
    <DataGrid ItemsSource="{Binding AllAuthors}" />
</Grid>

AllAuthorsは、いくつかの文字列プロパティのみObservableCollection<Author>Author持つ単純なクラスです。コレクションには、コードビハインドで約40000個のオブジェクトが含まれています。DataGridは非常に速く(1秒後)開き、データグリッド内のナビゲーションはスムーズかつ高速になります。アプリケーションのメモリ負荷は35MBです。

上記のコードを...に置き換えると

<StackPanel>
    <DataGrid ItemsSource="{Binding AllAuthors}" />
</StackPanel>

...アプリケーションは100%のCPU負荷で実行され、アプリケーションがDataGridを表示しようとしている間、メモリは最大1.5GBまで継続的に増加します。最後に私は受け取りますOutOfMemoryException

私はWPFの初心者で、ここで何が問題なのか疑問に思っています。(VS2010、.NET 4.0、およびWPF 4.0の組み込みDataGridコントロールを使用しています)

よろしくお願いします!

4

1 に答える 1

1

グリッド内にある限り、これは問題ではありません。おそらく、実際に生成されるアイテムはごくわずかであり、実際に表示されているアイテムです。これはUI仮想化と呼ばれ、WPFのいくつかのItemsControlに組み込まれています。DataGridはかなり小さいため、実際に生成されるアイテムはそれほど多くありません。

ただし、StackPanelに配置すると、StackPanelがDataGridの高さまで拡張され、DataGridが必要と思われるだけのスペースを使用するレイアウトを作成した可能性があります。それが当てはまるかどうかを確認するには、完全なxamlを確認する必要があります。とにかく、もしそうなら、今では実際にはかなり多くの「目に見える」アイテム(つまりすべて)があります。そして、40000アイテムを生成することは明らかに良い考えではありません。

2つのDataGridのActualHeightプロパティを比較しましたか?

于 2010-09-15T13:22:58.687 に答える