Сетка данных в StackPanel приводит к исключению OutOfMemoryException - PullRequest
1 голос
/ 15 сентября 2010

У меня есть сетка в окне WPF и элемент управления DataGrid внутри:

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

AllAuthors - это ObservableCollection<Author> и Author простой класс с несколькими строковыми свойствами. Коллекция содержит около 40000 объектов в коде позади. Сетка данных открывается довольно быстро (через 1 секунду), и навигация по сетке данных проходит плавно и быстро. Приложение имеет нагрузку на память 35 МБ.

Если я заменю код выше на ...

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

... приложение работает с 100% загрузкой ЦП, а объем памяти постоянно увеличивается до 1,5 ГБ, пока приложение пытается отобразить DataGrid. Наконец я получаю OutOfMemoryException.

Я новичок в WPF и теперь думаю, что здесь не так. (Я использую VS2010, .NET 4.0 и встроенный элемент управления DataGrid в WPF 4.0)

Заранее спасибо за помощь!

1 Ответ

1 голос
/ 15 сентября 2010

Пока это в сетке, это не проблема, так как, вероятно, фактически генерируются только несколько элементов - те, которые на самом деле видны в данный момент. Это называется виртуализацией пользовательского интерфейса и встроено в несколько ItemsControls в WPF. Поскольку DataGrid довольно маленький, на самом деле генерируется не так уж много элементов.

Однако, когда вы помещаете его в StackPanel, вы можете создать макет, в котором StackPanel расширяется до высоты DataGrid, тогда как DataGrid занимает столько места, сколько ему нужно. Нам нужно увидеть полный xaml, чтобы увидеть, так ли это. Во всяком случае, если это так, сейчас на самом деле довольно много «видимых» предметов (то есть всех). И генерировать 40000 предметов, очевидно, не очень хорошая идея.

Вы сравнили свойство ActualHeight двух DataGrids?

...