Когда у меня есть следующий TreeView в XAML (ItemsSource устанавливаются с помощью кода за длинный список списков списков):TreeView теряет виртуализацию с перегруженным шаблоном управления
<TreeView x:Name="Tree"
VirtualizingPanel.IsVirtualizing="True"
ScrollViewer.CanContentScroll="True">
<!-- ItemTemplate and ItemContainerStyle ommitted for brevity -->
</TreeView>
виртуализация работает просто отлично. Однако, когда я попытался переопределить шаблон TreeView вместе с внутренним шаблоном ScrollViewer, виртуализация исчезла. Мой шаблон кажется идентичным по умолчанию, за исключением цветного прямоугольника, который я вынул, что было всей мотивацией для переопределения шаблона.
<TreeView.Template>
<ControlTemplate TargetType="{x:Type TreeView}">
<ScrollViewer Focusable="False"
CanContentScroll="True">
<ScrollViewer.Template>
<ControlTemplate TargetType="{x:Type ScrollViewer}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width="auto" />
</Grid.ColumnDefinitions>
<ScrollContentPresenter Grid.Column="0" Grid.Row="0" />
<ScrollBar x:Name="PART_VerticalScrollBar"
Orientation="Vertical"
Grid.Row="0" Grid.Column="1"
Value="{TemplateBinding VerticalOffset}"
Maximum="{TemplateBinding ScrollableHeight}"
ViewportSize="{TemplateBinding ViewportHeight}"
Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}" />
<ScrollBar x:Name="PART_HorizontalScrollBar"
Orientation="Horizontal"
Grid.Row="1" Grid.Column="0"
Value="{TemplateBinding HorizontalOffset}"
Maximum="{TemplateBinding ScrollableWidth}"
ViewportSize="{TemplateBinding ViewportWidth}"
Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}" />
</Grid>
</ControlTemplate>
</ScrollViewer.Template>
<ScrollViewer.Content>
<ItemsPresenter x:Name="ItemsPresenter" />
</ScrollViewer.Content>
</ScrollViewer>
</ControlTemplate>
Я временно удосужился это, просто сделать прозрачной SolidColorBrush
названием {x:Static SystemColors.ControlBrushKey}
в ресурсах TreeView, но я бы предпочел, чтобы знать, что я сделал неправильно.
# 1 похоже, что это может быть актуально, но я не уверен, как я могу это решить. Я попытался установить высоту ScrollViewer на {{TemplateBinding Height}} (и то же самое для сетки внутри ScrollViewer), но не повезло. Что касается № 2, я использовал ItemPresenter (как вы можете видеть) и даже попытался явно установить ItemPanelTemplate, как предлагал @ d.moncada, но все равно не повезло. Я должен не согласиться с № 3; Я могу ясно видеть разницу с виртуализацией и без нее, даже когда ProductSource генерируется программно. Окно даже не загружается, когда виртуализация отключена. –