Медленный пользовательский контроль Загрузка WPF: ListBox не виртуализируется - PullRequest
0 голосов
/ 09 февраля 2019

Мое приложение MVFM WPF использует Linq2SQL для использования SQL Server Express.Я заметил, что после заполнения базы данных реальными данными пользовательский интерфейс обновляется с большими задержками, и я подумал, что это была моя стратегия запросов / группировки.Но в то время как некоторые из заполнений данных занимают более 100 мс, редко они занимают более 200 мс, но я вижу задержку до 3 секунд при обновлении окна.РЕДАКТИРОВАТЬ ДЛЯ BREVITY:

Я оборачивал мой ItemsControl в ScrollViewer:

    <ScrollViewer VerticalScrollBarVisibility="Auto" Grid.Column="0" Grid.Row="3" Grid.ColumnSpan="2" ScrollChanged="ScrollViewer_ScrollChanged">
        <ItemsControl x:Name="DivisionItems" ItemsSource="{Binding oObsByDiv}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <uc:ucObservationsHeader/>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </ScrollViewer>

Но после некоторых подсказок снизу и чтения по виртуализации я теперь использую ListBox, например, так:

<ListBox x:Name="DivisionItems" Grid.Column="0" Grid.Row="3" Grid.ColumnSpan="2" 
ItemsSource="{Binding oObsByDiv}" 
ScrollViewer.CanContentScroll="True"
VirtualizingStackPanel.ScrollUnit="Pixel">
<ListBox.Template>
    <ControlTemplate>
        <ScrollViewer VirtualizingStackPanel.IsVirtualizing="True"
                        VirtualizingStackPanel.VirtualizationMode="Recycling">
            <ItemsPresenter/>
        </ScrollViewer>
    </ControlTemplate>
</ListBox.Template>
<ListBox.ItemsPanel>
    <ItemsPanelTemplate>
        <VirtualizingStackPanel/>
    </ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
    <DataTemplate>
        <uc:ucObservationsHeader/>
    </DataTemplate>
</ListBox.ItemTemplate>

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

<ListBox ItemsSource="{Binding lObs}" Grid.Row="1" Grid.Column="1"
HorizontalContentAlignment="Stretch" ScrollViewer.HorizontalScrollBarVisibility="Disabled"
ScrollViewer.CanContentScroll="True"
VirtualizingStackPanel.ScrollUnit="Pixel">
<ListBox.Template>
    <ControlTemplate>
        <ScrollViewer VirtualizingStackPanel.IsVirtualizing="True"
                        VirtualizingStackPanel.VirtualizationMode="Recycling">
            <ItemsPresenter/>
        </ScrollViewer>
    </ControlTemplate>
</ListBox.Template>
<ListBox.ItemsPanel>
    <ItemsPanelTemplate>
        <VirtualizingStackPanel/>
    </ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
        <DataTemplate>
            <uc:ucObservationsView/>
        </DataTemplate>
</ListBox.ItemTemplate>

Но многократное второе отставание все еще существует.Внешний пользовательский элемент управления создается 15 раз, а внутренний имеет в среднем по 15 элементов каждый.Что в этом случае нарушает виртуализацию?Я продолжаю убирать ScrollUnit и CanContentScroll в одном или обоих местах, а также видимость HorizontalContentAlignement и HorizontalScrollBar, но они просто влияют на внешний вид, не являясь причиной нарушения виртуализации.

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