我有种编码到自己在这一个咸菜。 我正在写一个自定义的WPF控件是类似于TreeListView
描述这MSDN文章 ,以及在网络上其他许多地方。 这个东西一个相当大的堆在这一点上的定制,它的满足我的目标还算不错,除了在虚拟化领域。 我重写TreeView
和TreeViewItem
模板都使用VirtualizingStackPanel
s到展示他们的项目,我已经证明了随着预期这一切是越来越创建。 虚拟化可以正常工作的根目录下的项目(仅适用于那些当前可见的UI元素ScrollViewer
都熟了起来),和TreeView
东西需要不生成崩溃节点元素的照顾。 扩展一个节点时,问题就来了 - 所有元素都被炮制为节点中的每一个孩子,甚至是屏幕外的数千人。
在我看来,像所有我需要做的是某种程度上的内部嵌套的scrollowner属性设置VirtualizingStackPanel
s到同一主滚动视图根级VSP被默认迷上了,但我读了MSFT海报在这里说,这将不行。
不幸的是这个东西是缓慢,因为没有出现虚拟化泥,所以我需要拿出某种形式的解决方案。 任何建议将不胜感激。
我知道这是一个老问题,但仍然是相关的我。
在我来说,我想到了一个TreeView
不会削减,因为我到底需要两层,类型显示项目是在两层之间的不同。 另外,我重构列表Expander
太我想更多的一维。
但后来我意识到,你可以自定义ItemTemplate
中的TreeView
,包括你自己的HierarchicalDataTemplate
,并且您可以自定义ItemTemplate
是的HierarchicalDataTemplate
用自己定制DataTemplate
...普雷斯托! 整整两层,在每个不同的东西!
所以我的观点是, TreeView
是足够灵活,你应该尽量不要创建自己的自定义控制。
这是我做的:
XAML:
<Page x:Class="Foo.Views.TreePage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Foo.Views"
xmlns:viewModel="clr-namespace:Foo.ViewModels"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300"
Title="Tree page"
d:DataContext="{d:DesignInstance Type=viewModel:TreeModel}">
<TreeView
VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.VirtualizationMode="Recycling"
ScrollViewer.CanContentScroll="True"
VirtualizingPanel.ScrollUnit="Pixel"
ItemsSource="{Binding Values}"><!-- IList<Person> -->
<TreeView.ItemTemplate><!-- Template for first layer, which has a HierarchicalDataTemplate so that this layer will expand -->
<HierarchicalDataTemplate
ItemsSource="{Binding Expenses}"><!-- IList<Expense> -->
<HierarchicalDataTemplate.ItemTemplate><!-- Template for the second layer, which has a DataTemplate instead of HierarchicalDataTemplate so that this layer won't expand -->
<DataTemplate>
<TextBlock Text="{Binding Amount}"/><!-- Expense amount in dollars -->
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
<TextBlock Text="{Binding Name}"/><!-- Person name -->
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
</Page>
该Person
等级:
public class Person
{
public string Name { get; set; }
public List<Expense> Expenses { get; set; }
}
该Expense
类:
public class Expense
{
public double Amount { get; set; }
}
下面是它的外观:
我检查它探听证明它是UI虚拟化。 下面是装数量TreeViewItem
■当应用程序是小:
...这是加载的数量TreeViewItem
■当应用程序被全屏(它不断超越这个片段中,但你的想法):
现在,这只是事情的造型简单的事情,使嵌套层看怎么想!
编辑:我只是验证了TreeView
虚拟化的所有层,不只是第一层。
我有一个链接,什么不该用虚拟化的StackPanel做一个名单,但由于某些原因该页面出现空白。 这里是一个谈了一点另一页:
http://www.designerwpf.com/2008/02/12/listview-and-listbox-performance-issues/
甚至链接到一个IM议论纷纷,但其始终空白。 如果您在网页上看看它的链接马克Shurmer的博客。 下面是如果你想尝试一下链接:
http://itknowledgeexchange.techtarget.com/wpf/listview-is-it-really-too-slow/
BEA Stollnitz也有一些关于它的文章,可能会有所帮助:
第1部分 第2部分 第3部分
如果您发布一些代码的,有人也许能解开这个意大利面条有点帮助你得到一个更好的实现。
编辑:发现可能工作的链接(谢谢archive.org !!!): http://web.archive.org/web/20080104163725/http://itknowledgeexchange.techtarget.com/wpf/listview-is-it -really太缓/
文章来源: virtualizing nested containers (virtualizingstackpanel) to a single parent scrollbar in WPF