Datagrid очень низкая производительность, даже с виртуализацией пользовательского интерфейса - PullRequest
0 голосов
/ 20 мая 2011

Я сейчас использую DataGrid.около 24 столбцов создаются динамически в C #.

В моей DataGrid всегда есть около 300 записей (и поскольку одна запись представляет «заголовок», я не могу создавать системы подкачки, потому что мне нужно получить все данныена той же странице).

Это работает хорошо, но если я использую DataGridTemplateColumn s (потому что мне нужен стилизованный заголовок столбца, который имеет разделитель и 2 заголовка, так как мне нужно 2 вложенных столбца в каждом столбце)и шаблоны ячеек (все еще потому, что мне нужны эти 2 подстолбца), которые имеют двойную привязку (одну привязку для каждого подстолбца), когда я загружаю сетку, это просто невозможно ...

Я пробовал ВСЕтипы виртуализации (StackPanel, RowVirtualization, ColumnVirtualization со всеми различными типами комбинаций значений).«Лучшая» производительность, которую я мог бы получить, это установить RowVirtualization и ColumnVirtualization в True.

Теперь она «полезна», но все еще очень медленная, когда я выполняю горизонтальную прокрутку (даже с небольшой графической ошибкой, поскольку я используюFrozenColumn ...)

Я даже пытался использовать свой собственный ListView / GridView, и после нескольких часов работы над ним (чтобы воспроизвести замороженный столбец и т. Д.) Все еще остается та же "проблема".

Невозможно использовать виртуализацию данных (поскольку «только» 24 столбца с 285 строками не будут удобны для пользователей).

Спасибо!

РЕДАКТИРОВАТЬ 1: Вот код, генерирующий столбцы

        ColumnCollection = new ObservableCollection<DataGridColumn>();
        DataGridTemplateColumn firstDtc_l = new DataGridTemplateColumn();
        firstDtc_l.Header = "Titles";
        FrameworkElementFactory spFactory_l = new FrameworkElementFactory(typeof(Grid));
        ColumnCollection.Add(firstDtc_l);
        int i = 0;

        foreach (string s in DynamicColumns)
        {
            DataGridTemplateColumn dtc_l = new DataGridTemplateColumn();
            Binding bindColor = new Binding();
            bindColor.Converter = new ChangedColorConverter();
            bindColor.ConverterParameter = "Column" + i;

            //DataTemplate
            DataTemplate dt_l = new DataTemplate("MyObject");
            spFactory_l = new FrameworkElementFactory(typeof(Grid));
            spFactory_l.Name = "CellTemplate";
            FrameworkElementFactory columnDefinition1 = new FrameworkElementFactory(typeof(ColumnDefinition));
            FrameworkElementFactory columnDefinition2 = new FrameworkElementFactory(typeof(ColumnDefinition));
            FrameworkElementFactory border1 = new FrameworkElementFactory(typeof(Border));
            border1.SetValue(Grid.ColumnProperty, 0);
            border1.SetValue(Border.BorderBrushProperty, Brushes.Gray);
            border1.SetValue(Border.BorderThicknessProperty, new Thickness(0,0,0,0));
            FrameworkElementFactory border2 = new FrameworkElementFactory(typeof(Border));
            border2.SetValue(Grid.ColumnProperty, 1);
            border2.SetValue(Border.BorderBrushProperty, Brushes.Gray);
            border2.SetValue(Border.BorderThicknessProperty, new Thickness(1, 0, 0, 0));
            FrameworkElementFactory textBlock1 = new FrameworkElementFactory(typeof(TextBlock));
            textBlock1.SetValue(Grid.ColumnProperty, 0);
            textBlock1.SetValue(TextBlock.ForegroundProperty, bindColor);
            Binding firstBind = new Binding("MyObject[Column"+i+"].FirstBinding");
            textBlock1.SetValue(TextBlock.TextProperty, localBind);
            FrameworkElementFactory textBlock2 = new FrameworkElementFactory(typeof(TextBlock));
            Binding secongBind = new Binding("MyObject[Column" + i + "].SecondBinding");
            textBlock2.SetValue(Grid.ColumnProperty, 0);
            textBlock2.SetValue(TextBlock.TextProperty, firstBind) 
            textBlock2.SetValue(TextBlock.ForegroundProperty, secongBind);
            border1.AppendChild(textBlock1);
            border2.AppendChild(textBlock2);

            spFactory_l.AppendChild(columnDefinition1);
            spFactory_l.AppendChild(columnDefinition2);
            spFactory_l.AppendChild(border1);
            spFactory_l.AppendChild(border2);
            dt_l.VisualTree = spFactory_l;

            dtc_l.Width = DataGridLength.Auto;
            dtc_l.CellTemplate = dt_l;
            dtc_l.Header = s;
            ColumnCollection.Add(dtc_l);
            i++;
        }   

DataGrid связан с коллекцией «TheObject».Класс TheObject имеет public Dictionary<string, MyCell> MyObject { get; set; } Класс MyCell имеет свойства FirstBinding и SecondBinding (строка).

1 Ответ

0 голосов
/ 14 сентября 2011

У меня была похожая проблема с DataGrid, в которой потребовалось буквально несколько секунд для обновления после изменения размера окна, сортировки столбцов и т. Д. И блокировки пользовательского интерфейса окна (1000 строк, 5 столбцов).

Это связано с проблемой (ошибкой?) Расчетов размера WPF. У меня было это в сетке с RowDefinition Height = "Auto", которая заставляла систему рендеринга пытаться пересчитать размер DataGrid во время выполнения, измеряя размер каждого столбца и строки, предположительно, заполняя всю сетку ( как я понимаю). Предполагается, что это нужно как-то разумно, но в данном случае это не так.

Быстрая проверка, чтобы увидеть, является ли это связанной проблемой, состоит в том, чтобы установить свойства Высота и Ширина DataGrid на фиксированный размер на время теста, и попробуйте запустить снова. Если ваша производительность восстановлена, постоянное исправление может быть одним из следующих вариантов:

  • Изменить размеры содержащихся элементов на относительные (*) или фиксированные значения
  • Установите для MaxHeight и MaxWidth DataGrid фиксированное значение, большее чем он мог бы получить при обычном использовании
  • Попробуйте другой тип контейнера с другой стратегией изменения размера (Grid, DockPanel и т. Д.)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...