ItemsControl Virtualization - PullRequest
       0

ItemsControl Virtualization

0 голосов
/ 16 февраля 2020

У меня есть около 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 ));
            }
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...