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 решает проблему.

Другие вопросы по тегам