Мое приложение 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, но они просто влияют на внешний вид, не являясь причиной нарушения виртуализации.