当我在XAML中有以下TreeView时(ItemsSource通过代码隐藏设置为一长串列表列表):
<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>
我暂时通过在TreeView的资源中创建一个透明的SolidColorBrush
{x:Static SystemColors.ControlBrushKey}
来解决这个问题,但我更想知道我做错了什么。
答案 0 :(得分:0)
许多因素可能会破坏用户界面虚拟化,有时甚至在您不期望它时:
答案 1 :(得分:0)
我发现了问题。在ScrollViewer
模板中,ScrollContentPresenter
需要将CanContentScroll
设置为其模板化父级的值。
<ScrollContentPresenter Grid.Column="0" Grid.Row="0"
CanContentScroll="{TemplateBinding CanContentScroll}" />