Виртуализация элемента управления ItemsControl?

У меня есть элемент ItemsControl содержащий список данных, которые я бы хотел виртуализировать, однако VirtualizingStackPanel.IsVirtualizing="True" , похоже, не работает с ItemsControl .

Это действительно так или есть другой способ сделать это, о котором я не знаю?

Для проверки я использовал следующий блок кода:

        

Если я изменил ItemsControl на ListBox , я могу видеть, что событие Initialized запускается только несколько раз (огромные поля – это просто, так что мне нужно пройти через несколько записей), однако, поскольку ItemsControl каждый элемент получает инициализацию.

Я попытался установить ItemsControlPanelTemplate в VirtualizingStackPanel но это, похоже, не помогает.

На самом деле это гораздо больше, чем просто использование функции ItemsPanelTemplate VirtualizingStackPanel . По умолчанию ControlTemplate для ItemsControl не имеет ScrollViewer , который является ключом к виртуализации. Добавление к шаблону управления по умолчанию для ItemsControl (с использованием шаблона управления для ListBox в качестве шаблона) дает нам следующее:

                      

(BTW, отличный инструмент для поиска шаблонов управления по умолчанию – Show Me The Template )

Что следует заметить:

Вы должны установить ScrollViewer.CanContentScroll="True" , см. Здесь, почему.

Также обратите внимание, что я ставил VirtualizingStackPanel.VirtualizationMode="Recycling" . Это уменьшит количество раз, когда TextBlock_Initialized вызывается, однако многие текстовые блоки видны на экране. Здесь вы можете узнать больше о виртуализации пользовательского интерфейса.

EDIT: Забыл заявить очевидное: в качестве альтернативного решения вы можете просто заменить ItemsControl на ListBox 🙂 Также ознакомьтесь с этой оптимизацией производительности на странице MSDN и обратите внимание, что ItemsControl не находится в таблице «Элементы управления, обеспечивающие производительность», поэтому нам нужно отредактировать шаблон управления.

Основываясь на ответе DavidN, вот стиль, который вы можете использовать в ItemsControl для его виртуализации:

   

Мне не нравится предложение использовать ListBox, поскольку они позволяют выбирать строки, в которых вы не обязательно этого хотите.

Это просто, что по умолчанию ItemsPanel не является VirtualizingStackPanel . Вам нужно изменить его:

        
  • Как получить доступ к управлению текстовым полем Winform из другого classа?
  • Давайте будем гением компьютера.