WPF: виртуализация TreeView не работает
Что может остановить виртуализацию TreeView, если TreeView настроен следующим образом?
<TreeView
ItemsSource="{Binding}"
VirtualizingStackPanel.IsVirtualizing="True">
<TreeView.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel />
</ItemsPanelTemplate>
</TreeView.ItemsPanel>
<TreeView.ItemContainerStyle>
<Style
TargetType="{x:Type TreeViewItem}">
<Setter
Property="IsExpanded"
Value="{Binding IsExpanded, Mode=TwoWay}"/>
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
У меня есть тот, который не виртуализируется, когда я расширяю узлы (и использую snoop для проверки), у меня есть все создаваемые TreeViewItems. Мне интересно, есть ли какая-то комбинация контейнеров, которая не позволила бы TreeView виртуализировать свой контент. (например, разместить его в StackPanel)
1 ответ
Проблема была со стилем. После некоторого исследования мы обнаружили, что существует неназванный стиль, нацеленный на TreeView (т.е. DataType={x:Type TreeView}
без x:Key
) и один таргетинг TreeViewItem
в нашем App.xaml (или эквивалентном) ControlTemplate
для каждого соответственно.
Эти стили не имели триггеров для установки ItemsPanel
к VirtualizingStackPanel
и не было упоминания о какой-либо виртуализации. Когда стили удалены, TreeView работает нормально. Хотя местные свойства устанавливают ItemsPanel
и VirtualizingStackPanel.Isvirtualizing="True"
на TreeView
эти свойства не распространялись на TreeViewItems
поэтому верхний уровень TreeView будет виртуализироваться, а подкатегории - нет (так как их поведение виртуализации зависит от TreeViewItem
)
Была такая же проблема. В моем случае начальный размер TreeView не был ограничен (TreeView находится во всплывающем окне). Таким образом, панель виртуализации впервые инициализировала все элементы управления.
Установка MaxHeigt TreeView на 1000 решает проблему.