Низкая производительность представления списка в WPF - PullRequest
0 голосов
/ 30 января 2019

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

Я пробовал это и это .Не уверен, что я делаю что-то не так или не понимаю, как работает виртуализация?

У меня есть много стилей / добавлено поведение вида сетки для моего списка.Если у Вас есть предложения, пожалуйста, дайте мне знать!

Что я пробовал

  • Я попытался удалить CollapseableCollumnBehavior из представления списка.Без изменений.
  • Удалены все мои стили шрифтов.Без изменений.
  • Уменьшено количество столбцов.Произошло небольшое изменение, но оно все еще не отвечает.
  • Выключено IsSyncronizedWithCurrentItem.Без изменений.

Источник предмета

Мой источник предметов - это просто наблюдаемая коллекция. Так я загружаю в него данные.

private void LoadAllData()
{
    using (var uow = _unitOfWorkFactory.Create())
    {
        foreach (var rule in _ruleRepository.GetAllRulesInCheckProcess())
        {
            AllRulesInCheckProcess.Add(rule);
        }
    }
}

XAML:

Я вынул многие стили и добавил поведение столбцов из xaml для упрощения кода.

<ListView SelectedValue="{Binding SelectedRule}" 
      IsSynchronizedWithCurrentItem="True"
      Grid.Column="0"
      MinHeight="150"
      VirtualizingStackPanel.IsVirtualizing="True"
      VirtualizingStackPanel.VirtualizationMode="Recycling"
      ScrollViewer.IsDeferredScrollingEnabled="True"
      ItemsSource="{Binding AllRulesInCheckProcess}"
      MaxHeight="300"
      ScrollViewer.HorizontalScrollBarVisibility="Visible">
<ListView.View>
    <GridView>
        <GridViewColumn  DisplayMemberBinding="{Binding Description}" Width="auto">
            <GridViewColumnHeader Content="Description">
                <GridViewColumnHeader.ContentTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <TextBox Height="25" 
                                     FontSize="{StaticResource FontSizeSmall}" 
                                     Text="{Binding ElementName=RulesInCheckProgressPage, Path=DataContext.DescriptionFilter}"
                                     Tag="Filter Description"/>
                            <TextBlock Text="Description"/>
                        </StackPanel>
                    </DataTemplate>
                </GridViewColumnHeader.ContentTemplate>
            </GridViewColumnHeader>
        </GridViewColumn>
        <GridViewColumn DisplayMemberBinding="{Binding LaunchDate,StringFormat=MM/dd/yy}" 
                        Width="auto">
            <GridViewColumnHeader Content="Launch Date">
                <GridViewColumnHeader.ContentTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <TextBox Height="25" 
                                     FontSize="{StaticResource FontSizeSmall}" 
                                     Tag="Filter Launch Date"
                                     Text="{Binding ElementName=RulesInCheckProgressPage, Path=DataContext.LaunchDateFilter}"/>
                            <TextBlock Text="Launch Date"/>
                        </StackPanel>
                    </DataTemplate>
                </GridViewColumnHeader.ContentTemplate>
            </GridViewColumnHeader>

        </GridViewColumn>
        <GridViewColumn DisplayMemberBinding="{Binding AddedDate,StringFormat=MM/dd/yy}" Width="auto">
            <GridViewColumnHeader Content="Added Date">
                <GridViewColumnHeader.ContentTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <TextBox Height="25" 
                                     FontSize="{StaticResource FontSizeSmall}" Tag="Filter Added Date"
                                     Text="{Binding ElementName=RulesInCheckProgressPage, Path=DataContext.AddedDateFilter}"/>
                            <TextBlock Text="Added Date"/>
                        </StackPanel>
                    </DataTemplate>
                </GridViewColumnHeader.ContentTemplate>
            </GridViewColumnHeader>
        </GridViewColumn>
    </GridView>
</ListView.View>

ОБНОВЛЕНИЕ

Так что, проведя еще несколько исследований, кажется, мне, возможно, придется взглянуть на виртуализацию данных вместо виртуализации пользовательского интерфейса.Кто-нибудь знает какой-либо современный код виртуализации данных?

...