
我做了一个简单的项目,以确保UI虚拟化正确执行,并发现它根本不起作用 – 所有项目都被检索,而不仅仅是当前显示在屏幕上的项目.
我的XAML看起来像这样
<TreeVIEw x:name="myTree" Height="150" ItemsSource="{Binding Items}" VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Standard" ScrollVIEwer.IsDeferredScrollingEnabled="True" /> 而我的代码背后
public IEnumerable Items { get; set; } public MainWindow() { Items = GenerateList(); this.DataContext = this; InitializeComponent(); } private IEnumerable GenerateList() { MyList List = new MyList(); for (int i = 0; i < 1000; i++) { List.Add("Item " + i); } return List; } 请注意,MyList是我自己的IList实现,它包含一个ArrayList,除了转发到保持的ArrayList并向控制台写入调用哪个方法/属性之外什么也没做.例如:
public object this[int index]{ get { DeBUG.Writeline(string.Format("get[{0}]",index)); return _List[index]; } set { DeBUG.Writeline(string.Format("set[{0}]",index)); _List[index] = value; }} 如果我用ListBox替换我的TreeVIEw,UI虚拟化按预期工作 – 即只需要约20个项目而不是整个1000.
我在这里做错了吗?
编辑
我也尝试将默认的ItemsPanel替换为VirtualizingStackPanel,但是我得到了相同的结果.
解决方法 TreeVIEw的默认ItemsPanelTemplate是StackPanel而不是VirtualizingStackPanel,这就是为什么你看不到虚拟化的原因.而对于ListBox,默认的ItemsPanelTemplate是VirtualizingStackPanel,这就是为什么设置VirtualizingStackPanel.IsVirtualizing =“True”适用于ListBox的原因.要在TreeVIEw上启用虚拟化,除了设置属性VirtualizingStackPanel.IsVirtualizing =“True”,您需要覆盖其默认的itemsPanelTemplate,如下所示 –
<TreeVIEw x:name="myTree" Height="150" ItemsSource="{Binding Items}" VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Standard" VirtualizingStackPanel.CleanUpVirtualizedItem="myTree_CleanUpVirtualizedItem" ScrollVIEwer.IsDeferredScrollingEnabled="True"> <TreeVIEw.ItemsPanel> <ItemsPanelTemplate> <VirtualizingStackPanel IsItemsHost="True" /> </ItemsPanelTemplate> </TreeVIEw.ItemsPanel></TreeVIEw> 总结 以上是内存溢出为你收集整理的c# – TreeView不执行UI虚拟化全部内容,希望文章能够帮你解决c# – TreeView不执行UI虚拟化所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)