ScrollViewer замедляет работу с DataGrid - PullRequest
8 голосов
/ 31 августа 2011

У меня есть следующий сценарий:

<ScrollViewer>
    <Grid>
         <!--many other controls-->
         <DataGrid />
    </Grid>
</ScrollViewer>

Теперь, когда я связываю DataGrid с большим объемом данных (около 10.000 строк), у меня очень медленная производительность. Фактически, я получаю исключение OutOfmemory (и у меня 8 ГБ памяти)! Я где-то читал, что это потому, что ScrollViewer переопределяет виртуализацию DataGrid (или что-то в этом роде), но я не знаю, как это предотвратить. Если я удалю ScrollViewer, проблема решена! Данные загружаются менее чем за секунду.

Я хочу сохранить ScrollViewer (из-за других элементов управления) и иметь хорошую производительность. Это возможно? Если нет, то есть ли какое-нибудь решение?

Ответы [ 2 ]

7 голосов
/ 31 августа 2011

Обходной путь для решения подобных проблем - добавить невидимый «размерный элемент» в той же строке, что и DataGrid, после чего вы можете связать DataGrid.Height с ActualHeight элемента размераТаким образом, ваш DataGrid всегда будет потреблять высоту RowDefinition.Пример

<ScrollViewer>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <Button Content="Some Control.." />
        <Rectangle Name="sizingElement"
                   Grid.Row="1"
                   Fill="Transparent"
                   Margin="1"/>
        <DataGrid Grid.Row="1"
                  Height="{Binding ElementName=sizingElement,
                                   Path=ActualHeight, FallbackValue=1}">
            <!--...-->
        </DataGrid>
        <Button Content="Some more controls etc.." Grid.Row="2"/>
    </Grid>
</ScrollViewer>
2 голосов
/ 31 августа 2011

Внешний ScrollViewer эффективно предоставляет DataGrid столько пространства, сколько ему нужно, так что его высота становится огромной, показывая все строки одновременно.Просто ограничьте DataGrid, явно установив для него высоту, например.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...