Nano Hash - криптовалюты, майнинг, программирование

Низкая производительность ScrollViewer с DataGrid

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

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

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

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


Ответы:


1

Распространенным обходным путем для подобных проблем является добавление невидимого «элемента размера» в ту же строку, что и 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>
31.08.2011
  • Это решение, которое я искал. Большое Вам спасибо. 31.08.2011
  • @Vale: я не понимаю, внешнее средство просмотра прокрутки больше ничего не делает, если DataGrid не уменьшен до высоты 0. Зачем вам что-то подобное? 31.08.2011
  • @HB: Это может зависеть и от других факторов. Если у вас есть три строки, такие как Auto, *, Auto, и поместите DataGrid в среднюю строку с MinHeight из 100 и элементом управления, высота которого может быть от 10 до 1000 в последней строке, внешний ScrollViewer прокручивает Controls при необходимости. и DataGrid ScrollViewer прокручивает DataGrid 31.08.2011
  • @Meleak: Хм, хорошая мысль. Но я не могу не думать, что должен быть лучший способ сделать это, я использовал крепления реального размера для разных вещей, но это кажется мне немного неуместным... 31.08.2011
  • Отличный обходной путь. Это решило аналогичную установку, которая сводила меня с ума. 26.09.2013

  • 2

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

    31.08.2011
  • На самом деле это не лучшее решение. Если я сейчас изменю размер окна, размер DataGrid не изменится. 31.08.2011
  • @Vale: Как я уже сказал, это всего лишь пример, вам просто нужно ограничить размер, я бы, например, поместил DataGrid не в ScrollViewer, а в одну из ячеек сетки. 31.08.2011
  • DataGrid находится в ячейке сетки, но сетка отверстий находится внутри ScrollViewer. 31.08.2011
  • @Vale: вы должны размещать ScrollViewer только в ячейках сетки других элементов управления. 31.08.2011
  • Зачем мне помещать ScrollViewer в ячейку? Я хочу, чтобы окно с отверстием можно было прокручивать, поэтому я поместил его вокруг сетки. Сетка является содержимым окна. 31.08.2011
  • Насколько точно вы ожидаете изменения размера DataGrid, если вы измените размер окна? Если у вас есть что-то в средстве просмотра прокрутки, содержимое, по определению, не изменяет размер, поскольку средство просмотра просто показывает больше или меньше содержимого. Просто подумайте немного сами и ограничьте DataGrid любым способом, который подходит для вашей ситуации, это не так сложно... 31.08.2011
  • На самом деле это так. Вся моя команда пытается найти решение этой конкретной проблемы, и пока никому это не удается. Невозможно ограничить размер DataGrid, его ширина и высота не установлены, поэтому он изменяет размер с ячейкой сетки, для которой установлено значение *. ScrollViewer — это содержимое, но также без размера, поэтому оно всегда соответствует размеру окна. Нам нужно такое поведение для многих проектов... 31.08.2011
  • @Vale: Итак, вы хотите, чтобы вся сетка данных была там, чтобы ее можно было прокручивать с помощью внешнего средства просмотра прокрутки, но она должна виртуализировать свои элементы? Если это так, я бы не рекомендовал это, во-первых, внешнее средство просмотра прокрутки не заботится о заголовках столбцов, поэтому их можно вывести из поля зрения, во-вторых, реализовать это для фактической виртуализации, по меньшей мере, нетривиально, поэтому я не рекомендовал бы это вообще. DataGrid не предназначен для прокрутки внешними средствами ScrollViewer. 31.08.2011
  • На самом деле я не хочу, чтобы внешнее средство просмотра прокрутки влияло на мою сетку данных. Но в то же время я хочу, чтобы сетка данных находилась внутри средства просмотра прокрутки. Это возможно? 31.08.2011
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..