silverlight 4 treeview在扩展许多项目时缓慢

时间:2011-10-26 13:22:08

标签: silverlight performance

在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月工具包。

4 个答案:

答案 0 :(得分:3)

与WPF不同,Silverlight(直到Silverlight 4,不确定5)不支持分层数据的UI虚拟化,这就是为什么当您展开节点时,HierarchicalDataTemplate内的1000个项目不是虚拟化,加载时间超过10秒。

我相信Telerik的RadTreeView有内置的UI虚拟化,但控件不是免费的。

到目前为止,我找到的最佳解决方案来自this site。请注意,它仍然是ListBox解决方案,因为它不使用HierarchicalDataTemplate,它完全虚拟化,看起来与TreeView完全相同。另外,通过查看源代码,可以很容易地实现。

enter image description here

我知道这不是这个问题的完美答案,但至少可以给你一些选择。 :)

答案 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