none
treeView的虚拟化怎样使用才有效果? RRS feed

  • 问题

  • 本人wpf菜鸟。wpf知识是根据所要做的项目针对性学习的。知识可能有点散

    TreeViewItem显示效果描述:

    左边是小图片,右边是文字,显示的图片文件所在地址都是同一个地址,图片分辨率很小,大约30-40左右。

    提问原因:

    buttonclick事件完成treeView绑定的泛型集合进行递归数据加载,使treeView能显示递归树的数据,加载好了,然而却有另一个问题。加载慢。于是去网上看看有什么方法能解决。找到一个似乎看似简单的办法,在treeView加上这个VirtualizingStackPanel.IsVirtualizing="True" 代码感觉就可以解决,概念上叫虚拟化或可视化浏览。在treeView上写上此代码后,开启计时器代码编译时发现,跟没加的加载时间区别不大。

    疑惑:

    难道是虚拟化的使用方式不对导致的?还是绑定的数据集合的实体类设计不好?我的实体类大部分属性都是string类型,依赖属性只有一个,还有一个datetime类型和一个ImageSource类型,这个属性获取图片,并和image控件的Source属性绑定,是ImageSource类型的属性导致的吗?

    去一些网站看了一些虚拟化。注意到这两个要点的某句话

    1. VirtualizingPanel是需要和ScrollViewer一起使用的,没有ScrolViewer的话,所有控件都是可见的,谈不上虚拟化。需要注意的是,ItemsControl的默认Template没有ScrollViewer,在ItemsControl中使用VirtualizingPanel时,需要修改一下Template,加上ScrollViewer
    2.  UI虚拟化是需要在不呈现所有的UI控件前提下知道当前视图下元素呈现效果的,如果所有的数据都转换了为控件的话,也就谈不上虚拟化了。也就是说,不能靠MeasureArrange所有子元素来确定布局。

    ScrollViewer我记得是滚动条吧。treeView好像自带有。Template没有ScrollViewer,需要修改一下Template,加上ScrollViewer?这句话是什么意思?需要在treeView中加上有关ScrollViewer的代码?

    “如果所有的数据都转换了为控件的话,也就谈不上虚拟化了。”这句话表明是否可以表明:列表类控件绑定的数据集合中,多个数据转换为列表的item控件时的数量是可以控制的?用什么代码控制啊?系统自动控制的?


    2016年10月24日 7:01

答案


  • Hi 轮回的齿轮,

    >>ScrollViewer我记得是滚动条吧。treeView好像自带有。Template没有ScrollViewer,需要修改一下Template,加上ScrollViewer?这句话是什么意思?需要在treeView中加上有关ScrollViewer的代码?

    据我理解,一个组合框绑定大量数据的时候,它会让组合框中项目的展现变得非常慢,这是因为在这种情况下,程序需要计算每个项目的具体显示位置,所以我们需要一个容器来延迟这个行为,这就叫做UI虚拟化,它只会在容器可见范围内生产项目显示需要的内容。 所以并不是一定需要ScrollViewer来配合TreeView一起使用。

    关于如何在Treeview 使用虚拟化,你可以参考微软的例子。TreeView 和 StackPanel 一起使用,开启VirtualizingStackPanel.IsVirtualizing=true。

    如何:提高 TreeView 的性能:

    我们一般也会使用容器回收提高性能,通过回收执行虚拟化的容器来提高性能,下面的代码片段将ViruatlizationMode设为Recycling,它让你可以获得更好的性能。当用户滚动或抵达另一个项目时,它强制重复使用容器对象。

    settingVirtualizingStackPanel.VirtualizationMode="Recycling"

    >>“如果所有的数据都转换了为控件的话,也就谈不上虚拟化了。”这句话表明是否可以表明:列表类控件绑定的数据集合中,多个数据转换为列表的item控件时的数量是可以控制的?用什么代码控制啊?系统自动控制的?

    据我所知,这个是系统自动控制的。

    下面文章介绍了如何优化WPF控件。

    优化性能:控件:


    Best Regards,

    Yohann Lu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2016年10月25日 6:29
    版主