Использование виртуализации для WPF DataGrid внутри ScrollViewer

Я знаю, что DataGrid поддерживает виртуализацию, поэтому он создает ячейки сетки только для видимых строк. Однако похоже, что это работает только в том случае, если размер DataGrid ограничен.

В моем сценарии DataGrid помещается в средство просмотра прокрутки, например

<ScrollViever>
    <StackPanel>

        <more elements .../>

        <DataGrid ... />

        <more elements .../>

    </StackPanel>
</ScrollViever>

Кажется, это нарушает виртуализацию. В тех случаях, когда DataGrid должен отображать большое количество элементов, визуальное дерево становится очень большим даже до прокрутки вниз во внешнем ScrollViewer.

Есть ли способ предотвратить предварительное создание всех ячеек DataGrid и их создание при прокрутке вниз ScrollViewer?

РЕДАКТИРОВАТЬ: в основном страница, на которой это размещено, должна быть похожа на веб-страницу с некоторым текстом вверху, большой таблицей и еще одним текстом внизу. Вместо dockview, где всегда видно верх / низ и прокручивается только сетка, должна прокручиваться вся страница. Настройка достигает этого, но страдает от того, что все заранее создано.

ДРУГОЕ РЕДАКТИРОВАНИЕ: есть ли способ определить, что определенная строка таблицы данных была прокручена в поле зрения? Типичные статьи с отложенной загрузкой используют scrollviewer datagrid для добавления дополнительных элементов в сетку, что здесь не работает.


person user1211286    schedule 06.12.2013    source источник
comment
VirtualisingStackPanel?   -  person Craig Graham    schedule 06.12.2013
comment
Но будет ли VirtualizingStackPanel (как родительский элемент DataGrid) заставлять DataGrid генерировать только свои видимые дочерние элементы? Насколько я понимаю, VirtualizingStackPanel будет создавать своих дочерних элементов по запросу, что означает, что как только первый верхний пиксель DataGrid станет видимым, будет создан ВСЕ DataGrid? Или я что-то упускаю?   -  person user1211286    schedule 06.12.2013
comment
Только что протестировано: ScrollViewer-VirtualizingStackPanel-DataGrid не решает проблему. DataGrid по-прежнему предварительно сгенерирует все свои строки   -  person user1211286    schedule 06.12.2013
comment
Ну что ж, это была мысль. Я не знаю решения, которое сохранит ваши дополнительные элементы в StackPanel и избегает представления DataGrid собственной полосы прокрутки. StackPanel сообщает своим дочерним элементам, что у них есть бесконечная высота для использования, поэтому, конечно, DataGrid использует ее. Если бы это был я, следующее, что я бы попробовал, - это ограничить высоту DataGrid высотой StackPanel, скрыть обе полосы прокрутки, создать новую полосу прокрутки и привязать ее к чему-то, что контролирует позиции прокрутки как StackPanel, так и DataGrid в способ, который заставляет это выглядеть правильно. Сложный.   -  person Craig Graham    schedule 06.12.2013


Ответы (2)


Да, вы вроде ответили на свой вопрос. Если вы поместите DataGrid в ScrollViewer или StackPanel или любой элемент управления, который не передает ограничение исправления в DataGrid, это нарушит виртуализацию в DataGrid.

Вы можете исправить это, задав значения исправления DataGrid.Width и DataGrid.Height.

Вам необходимо знать эти фиксированные значения для виртуализации. Виртуализация требует исправления предков.

Вот как можно указать размер исправления DataGrid:

Просто привяжите высоту / ширину к ScrollViewer или Grid.

<Grid x:Name="grid" >
   <ScrollViever>
       <StackPanel>

           <more elements .../>

           <DataGrid Width={Binding ElementName=grid, Path=Width..} Height={Binding ElementName...} />

           <more elements .../>

       </StackPanel>
   </ScrollViever>
<Grid>

Вот и все :)

person dev hedgehog    schedule 06.12.2013
comment
Обратной стороной этого является то, что я получаю нежелательный эффект scrollviewer-inside-scrollviewer. Пользователи испытывают трудности при взаимодействии с двумя полосами прокрутки с правой стороны - одна прокручивает весь вид, а другая - только строки таблицы данных внутри представления. - person user1211286; 06.12.2013
comment
Ну ... это вопрос, лол? Думаю, тогда вам придется подумать об изменении дизайна пользовательского интерфейса? Если вы разместите здесь длинный код в stackoverflow, вы получите полосы прокрутки и, конечно же, полосы прокрутки браузера по умолчанию также будут видны. В итоге у вас ситуация похожая на вашу. Ответ 42 :) Шучу. Но давайте снова будем серьезными. Если вы хотите иметь другой дизайн для вашего представления, дайте мне знать, если я могу помочь. :) - person dev hedgehog; 06.12.2013

Не помещайте его в ScrollViewer, он будет растягиваться столько, сколько захочет, то есть будет его весь размер.

person i know nothing    schedule 20.01.2014