У меня есть около 300 элементов в моем BindableCollection , которые я отображаю в своем пользовательском интерфейсе в оболочке через ItemsControl. (300 для тестовых целей, позже это может быть меньше или больше). DataTemplate не является чем-то особенным, он просто состоит из сеток со строками и столбцами, кнопки плитки из MahApps.
<ScrollViewer>
<ItemsControl x:Name="ItemsControl"
AlternationCount="300" IsEnabled="True"
ItemTemplate="{StaticResource ItemTemplate}"
ItemsSource="{Binding myData}"
ScrollViewer.CanContentScroll="True">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</ScrollViewer>
Когда я окружаю ItemsControl с помощью ScrollViewer занимает некоторое время до его загрузки и очень не отвечает, после этого, хотя прокрутка очень плавная и отзывчивая, но навигация между другими представлениями / Windows очень запаздывает. Поэтому я посмотрел его и обнаружил, что WrapPanel не поддерживает виртуализацию, и вместо этого обнаружил VirtualizingWrapPanel.
<wpftk:VirtualizingItemsControl x:Name="ItemsControl"
AlternationCount="300" IsEnabled="True"
ItemTemplate="{StaticResource ItemTemplate}"
ItemsSource="{Binding myData}"
VirtualizingPanel.CacheLength="100.100"
VirtualizingPanel.CacheLengthUnit="Pixel"
VirtualizingPanel.IsContainerVirtualizable="True"
VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.IsVirtualizingWhenGrouping="True"
VirtualizingPanel.ScrollUnit="Pixel"
VirtualizingPanel.VirtualizationMode="Standard">
<wpftk:VirtualizingItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<wpftk:VirtualizingWrapPanel IsItemsHost="True" Orientation="Vertical"
SpacingEnabled="True" />
</ItemsPanelTemplate>
</wpftk:VirtualizingItemsControl.ItemsPanel>
</wpftk:VirtualizingItemsControl>
С wpftk: VirtualizingItemsControl загрузка коллекции теперь очень быстрая и Мой пользовательский интерфейс хорошо реагирует во время загрузки и после нее, но на этот раз прокрутка очень запаздывает, и я заметил, что при быстрой прокрутке индексы элементов постоянно меняются, что является огромной проблемой. Поэтому я попробовал то же самое, что и выше, окружив Control элементом ScrollViewer, плавная прокрутка назад вернулась, а постоянно меняющиеся индексы элементов прекратились, но медленная навигация все еще сохраняется. Я понятия не имею, почему индексы меняются, я пытался поиграть со свойствами VirtualizingPanel, хотя ни одно из них не оказало на него никакого влияния, поэтому я предполагаю, что причиной медленной прокрутки могут быть постоянные изменения индексов элементов. Есть причина, по которой он меняется? Какие-либо предложения ? Какие улучшения я могу сделать?
Способ добавления TestItems
_ = Task.Run(() =>
{
SelectedPath = @"C:\Program Files\7-Zip\7zFM.exe";
Data= new BindableCollection<DataModel>();
int newCount = Data.Count + 300;
for (int i = Data.Count; i < newCount; i++)
{
Data.Add(new DataModel(SelectedPath, i ));
}
});