Ответ 1
На самом деле, здесь гораздо больше, чем просто использование ItemsPanelTemplate
использованием VirtualizingStackPanel
. Стандартный ControlTemplate
для ItemsControl
не имеет ScrollViewer
, который является ключом к виртуализации. Добавление к шаблону ItemsControl
управления по умолчанию для ItemsControl
(использование шаблона ListBox
управления для ListBox
в качестве шаблона) дает нам следующее:
<ItemsControl
VirtualizingStackPanel.IsVirtualizing="True"
ScrollViewer.CanContentScroll="True"
ItemsSource="{Binding Path=AccountViews.Tables[0]}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock
Initialized="TextBlock_Initialized"
Text="{Binding Path=Name}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.Template>
<ControlTemplate>
<Border
BorderThickness="{TemplateBinding Border.BorderThickness}"
Padding="{TemplateBinding Control.Padding}"
BorderBrush="{TemplateBinding Border.BorderBrush}"
Background="{TemplateBinding Panel.Background}"
SnapsToDevicePixels="True">
<ScrollViewer
Padding="{TemplateBinding Control.Padding}"
Focusable="False">
<ItemsPresenter
SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
</ScrollViewer>
</Border>
</ControlTemplate>
</ItemsControl.Template>
</ItemsControl>
(Кстати, отличным инструментом для просмотра шаблонов управления по умолчанию является Show Me The Template)
На что обратить внимание:
Вы должны установить ScrollViewer.CanContentScroll="True"
, см. Здесь, почему.
Также обратите внимание, что я поставил VirtualizingStackPanel.VirtualizationMode="Recycling"
. Это уменьшит количество обращений к TextBlock_Initialized
, однако многие текстовые блоки видны на экране. Вы можете прочитать больше о виртуализации пользовательского интерфейса здесь.
РЕДАКТИРОВАТЬ: забыл заявить об очевидном: в качестве альтернативного решения вы можете просто заменить ItemsControl
на ListBox
:) Кроме того, проверьте эту страницу "Оптимизация производительности на MSDN" и обратите внимание на то, что ItemsControl
отсутствует в таблице "Элементы управления, реализующие функции производительности", поэтому нам нужно отредактировать шаблон элемента управления.