代码之家  ›  专栏  ›  技术社区  ›  BrokenGlass

WPF虚拟化Treeview中的滚动错误

  •  4
  • BrokenGlass  · 技术社区  · 15 年前

    我在WPF中使用一个虚拟化的treeview来显示一个3层的深层层次结构,其中包含更多的子节点(5000+)。

    <TreeView Grid.Row="0" Grid.Column="0" Name="TestTree"  ItemsSource="{Binding}" VirtualizingStackPanel.IsVirtualizing="True">
    ...
    </TreeView>
    

    如果我在第三层展开子节点并滚动到最后,内容就无法正确显示,滚动条会“向后翻转”,我可以继续向下滚动,再滚动一段时间后,这种行为就会重复。

    这只会在虚拟化模式下发生,但不幸的是,由于子节点数量太多,在非虚拟化模式下加载treeview的时间太长。

    我已经在网上阅读了以下链接 here 以及MSDN论坛上的原始帖子 here 但建议的解决办法是打电话 UpdateLayout() 在SelectedItemChanged中,处理程序对我不起作用。

    以前有没有其他人经历过这种奇怪的行为,如果有,是否有解决办法?

    感谢您的任何意见-谢谢!

    1 回复  |  直到 9 年前
        1
  •  0
  •   Ariel    15 年前

    你有没有试过加载这些物品??我的意思是,您可以首先(不虚拟化)只加载根节点,然后当这些节点中的每一个都被扩展时,加载它的子节点。

    在这种情况下,我通常使用TreeViewItemModel类,比如:

    public class TreeViewItemViewModel : INotifyPropertyChanged
    {
        public IEnumerable<TreeViewItemViewModel> Childs { get; }
        public bool IsSelected { get; set; }
        public bool IsExpanded { get; set; }
        (...)
    }
    

    然后在TreeView的ItemContainerStyle中,使用双向绑定绑定IsSelected和IsExpanded属性,然后在属性IsExpanded的setter中加载所有的子属性。

    我已经用理论上超过5000个项目的树测试了这种方法,但从来没有同时加载所有项目。

    希望这有帮助。。。