2013-12-06 6 views
1

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

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

<ScrollViever> 
    <StackPanel> 

     <more elements .../> 

     <DataGrid ... /> 

     <more elements .../> 

    </StackPanel> 
</ScrollViever> 

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

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

EDIT: в основном размещение страницы должно быть похоже на веб-страницу с текстом наверху, большой стол и еще один текст внизу. Вместо dockview, где верхняя/нижняя всегда видна, и только прокрутка сетки, вся страница должна прокручиваться. Настройка достигает этого, но страдает от всего, что было создано заранее.

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

+0

VirtualisingStackPanel? –

+0

Но будет ли VirtualizingStackPanel (как родитель DataGrid) заставлять DataGrid генерировать только видимые дочерние элементы? Я понимаю, что VirtualizingStackPanel будет создавать дочерние элементы ITS по требованию, что означает, что как только первый верхний пиксель DataGrid станет видимым, будет создан ENTIRE DataGrid? Или я чего-то не хватает? – user1211286

+0

Только что протестировано: ScrollViewer-VirtualizingStackPanel-DataGrid не решает проблему. DataGrid все еще будет генерировать все свои строки. – user1211286

ответ

1

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

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

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

Вот как вы можете дать DataGrid размер починки:

Просто привязывать Высота/Widht к 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> 

Это было бы это :)

+1

Недостатком этого является то, что я получаю нежелательный эффект scrollviewer-inside-scrollviewer.У пользователей есть трудности с взаимодействием с двумя полосами прокрутки с правой стороны - одна прокрутка всего представления, а другая - только строки данных в представлении. – user1211286

+0

Ну, ... это вопрос LOL? Думаю, вам придется рассмотреть возможность изменения UI Desgin? Если вы разместите длинный код здесь в stackoverflow, вы получите ScrollBars, и, конечно же, будут показаны прокрутки браузера Defaul. В конце концов, у вас есть схожая ситуация с вашей. Ответ: 42 :) Я шучу. Но давайте снова серьезно. Если вы хотите иметь другой дизайн для своего вида, то дайте мне знать, могу ли я помочь. :) –

0

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

Смежные вопросы