在XAML中我有:
<sdk:TreeView x:Name="navigationTreeView" Grid.Column="0" Grid.Row="1" SelectedItemChanged="TreeView_SelectedItemChanged">
<sdk:TreeView.ItemContainerStyle>
<Style TargetType="sdk:TreeViewItem">
<Setter Property="IsExpanded" Value="True"/>
</Style>
</sdk:TreeView.ItemContainerStyle>
<sdk:TreeView.ItemTemplate>
<sdk:HierarchicalDataTemplate ItemsSource="{Binding Path=Nodes}">
<StackPanel Orientation="Horizontal">
<!--<Image Source="{Binding Path=ImageUri}" />-->
<TextBlock Text="{Binding Path=Title}" ToolTipService.ToolTip="{Binding Path=Title}"/>
</StackPanel>
</sdk:HierarchicalDataTemplate>
</sdk:TreeView.ItemTemplate>
</sdk:TreeView>
在代码背后:
this.navigationTreeView.ItemsSource = nodes;
navigationTreeView.ExpandAll();
有1000个项目作为一个节点的子项。如果我不扩展元素一切都很好。但是,当我扩展该节点时,它很慢(可能是10秒)。我该怎么做才能加快速度?
Silverlight 4,2010年4月工具包。
答案 0 :(得分:3)
与WPF不同,Silverlight(直到Silverlight 4,不确定5)不支持分层数据的UI虚拟化,这就是为什么当您展开节点时,HierarchicalDataTemplate
内的1000个项目不是虚拟化,加载时间超过10秒。
我相信Telerik的RadTreeView
有内置的UI虚拟化,但控件不是免费的。
到目前为止,我找到的最佳解决方案来自this site。请注意,它仍然是ListBox
解决方案,因为它不使用HierarchicalDataTemplate
,它完全虚拟化,看起来与TreeView
完全相同。另外,通过查看源代码,可以很容易地实现。
我知道这不是这个问题的完美答案,但至少可以给你一些选择。 :)
答案 1 :(得分:2)
这就是TreeView的工作原理。它默认是虚拟化的:它不会在需要之前创建TreeViewItems。但是,您正在扩展整个树,这会强制创建所有项目。那本身就很慢。如果你真的需要这种行为(所有选择都被扩展),我会建议像ListBox这样的其他东西。在需要之前不会创建任何滚动屏幕的内容(但请参阅this caveat。)
答案 2 :(得分:0)
试试这个:
<sdk:TreeView.ItemTemplate>
<sdk:HierarchicalDataTemplate ItemsSource="{Binding Path=Nodes}">
<VirtualizingStackPanel Orientation="Horizontal">
<!--<Image Source="{Binding Path=ImageUri}" />-->
<TextBlock Text="{Binding Path=Title}" ToolTipService.ToolTip="{Binding Path=Title}"/>
</VirtualizingStackPanel>
</sdk:HierarchicalDataTemplate>
</sdk:TreeView.ItemTemplate>
将一个正常的StackPanel替换为一个VirtualizingStackPanel ...
答案 3 :(得分:0)
我的糟糕堆栈面板不在正确的位置......
好的,试试这个:
<sdk:TreeView x:Name="navigationTreeView" Grid.Column="0" Grid.Row="1" SelectedItemChanged="TreeView_SelectedItemChanged">
<sdk:TreeView.ItemContainerStyle>
<Style TargetType="sdk:TreeViewItem">
<Setter Property="IsExpanded" Value="True"/>
</Style>
</sdk:TreeView.ItemContainerStyle>
<sdk:TreeView.ItemTemplate>
<sdk:HierarchicalDataTemplate ItemsSource="{Binding Path=Nodes}">
<StackPanel Orientation="Horizontal">
<!--<Image Source="{Binding Path=ImageUri}" />-->
<TextBlock Text="{Binding Path=Title}" ToolTipService.ToolTip="{Binding Path=Title}"/>
</StackPanel>
</sdk:HierarchicalDataTemplate>
</sdk:TreeView.ItemTemplate>
<sdk:TreeView.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel />
</ItemsPanelTemplate>
</sdk:TreeView.ItemsPanel>
</sdk:TreeView>
添加:
<sdk:TreeView.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel />
</ItemsPanelTemplate>
</sdk:TreeView.ItemsPanel>
让我知道结果:D