XAML 缓慢展开和折叠TreeView节点

s8vozzvw  于 2022-12-07  发布在  其他
关注(0)|答案(1)|浏览(146)

当TreeView中的一个节点包含很多元素时,比如超过2000个元素,它的展开和折叠非常慢。对于ListView,我使用的是增量加载:

<ListView
   Width="500"
   MaxHeight="400"
   IsItemClickEnabled = "False"
   SelectionMode ="None"
   IncrementalLoadingThreshold="5"
   IncrementalLoadingTrigger="Edge"
   ScrollViewer.VerticalScrollBarVisibility="Visible"
   ScrollViewer.VerticalScrollMode="Enabled"/>

但是,我没有看到TreeView的此类选项。如何优化此选项?

dzjeubhm

dzjeubhm1#

缓慢展开和折叠TreeView节点
TreeViewTreeViewItem都不包含IncrementalLoading行为,所以不能对树视图进行增量加载,但可以通过linq select-take方法处理数据源,实现增量加载功能。
在用于加载更多项的最后一个TreeViewItem中放置按钮。
比如说

<DataTemplate x:Key="FileTemplate" x:DataType="local:ExplorerItem">
    <TreeViewItem AutomationProperties.Name="{x:Bind Name}" IsSelected="{x:Bind IsSelected,Mode=TwoWay}">
        <StackPanel Orientation="Horizontal">
            <Image Width="20" Source="../Assets/file.png" />
            <TextBlock Margin="0,0,10,0" />
            <TextBlock Text="{x:Bind Name}" />
            <Button Background="White" Margin="15,0,0,0" x:Name="LoadMore"  Visibility="{Binding IsLastItem}" 
                    Command="{Binding  LoadMoreCommand}" CommandParameter="{Binding}">
                <SymbolIcon Symbol="More"/>
            </Button>
        </StackPanel>
    </TreeViewItem>
</DataTemplate>

代码隐藏

WeakReferenceMessenger.Default.Register<object>(this, (s, e) =>
{
    var temp = subitems.Skip(subitems.IndexOf(e as ExplorerItem)+1).Take(20);
    (e as ExplorerItem).IsLastItem = false;
    foreach (var item in temp)
    {            
        folder1.Children.Add(item);
    }
    folder1.Children.Last().IsLastItem = true;

});

有关完整代码,请参阅此link

相关问题