WPF: виртуализация TreeView не работает - PullRequest
6 голосов
/ 22 ноября 2010

Что может остановить виртуализацию 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 Ответ

6 голосов
/ 25 ноября 2010

Проблема была со стилем.После некоторого исследования мы обнаружили, что был неназванный стиль, нацеленный на TreeView (то есть, с DataType={x:Type TreeView} без x:Key) и один нацеливающийся на TreeViewItem в нашем App.xaml (или эквивалентном). Он переопределял ControlTemplateдля каждого соответственно.

В этих стилях не было триггеров для установки ItemsPanel на VirtualizingStackPanel и не упоминалось ни о какой виртуализации.Когда стили удалены, TreeView работает нормально.Хотя локальные свойства устанавливают ItemsPanel и VirtualizingStackPanel.Isvirtualizing="True" на TreeView, эти свойства не распространяются на TreeViewItems, поэтому верхний уровень TreeView будет виртуализироваться, а подкатегории - нет (как их виртуализация).поведение зависело от TreeViewItem)

...