背景
我有一个自定义控件,它继承自TreeView并被修改为以数据网格样式显示。我看到的问题是扩展树时的性能。这在我对Tree Views的研究中很常见。在使用WPF Performance工具检查后,我注意到ItemsPresenter类使用的是常规Stack Panel而不是Virtualizing Stack Panel。
以下是使用ScrollContentPresenter的代码部分(在图片中显示)。
<ScrollContentPresenter Name="PART_ScrollContentPresenter"
KeyboardNavigation.DirectionalNavigation="Local"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
CanContentScroll="{TemplateBinding CanContentScroll}"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
这是传入的模板。
<ControlTemplate TargetType="CommonControls:TreeListViewItem508">
<Grid >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Border x:Name="item">
<Border Name="InnerBorder">
<Grid Style="{StaticResource GridBackgroundStyle}">
<Rectangle Visibility="Collapsed" Fill="#75FFFFFF" Name="UpperHighlight" />
</Grid>
</Border>
</Border>
<ItemsPresenter Grid.Row="1" Name="ItemsHost" />
</Grid>
</ControlTemplate>
问题
是否可以强制项目演示者使用虚拟化堆栈面板?
备注
非常感谢任何建议或选项。
解决:
我通过将样式添加到样式来修改模板的样式,并将堆栈面板切换为虚拟化。
<Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<VirtualizingStackPanel />
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
答案 0 :(得分:4)
您可以使用VirtualizingStackPanel
,但请注意there is more to virtualizing a StackPanel than just using a VirtualizingStackPanel
以下是使用上面发布的链接中的代码的示例,其中列出了所需的项目:
<ItemsControl ...
VirtualizingStackPanel.IsVirtualizing="True" <!-- this is needed -->
ScrollViewer.CanContentScroll="True" > <!-- this is needed -->
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel /> <!-- this is needed -->
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.Template>
<ControlTemplate>
<Border ...>
<ScrollViewer> <!-- this is needed -->
<ItemsPresenter />
</ScrollViewer>
</Border>
</ControlTemplate>
</ItemsControl.Template>
</ItemsControl>
答案 1 :(得分:3)
尝试
<TreeView>
<TreeView.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel/>
</ItemsPanelTemplate>
</TreeView.ItemsPanel>
</TreeView>
或
<TreeView VirtualizingStackPanel.IsVirtualizing="True">
用您的树视图控件名称替换TreeView。
希望有所帮助
保