具有列、UI虚拟化和数据虚拟化的WPF TreeView

5
我正在寻找一个 WPF 控件(免费或商业)。
树应支持所有常规树形视图特征(样式,数据模板,控件模板等),并支持使用列进行布局(有点像 Visual Studio 中的 Watch 窗口)。
此外,还需要具备以下特点:
1. 良好的虚拟化 - 应支持数千个元素 2. 内置数据虚拟化 - 加载和处理数据较慢,无法一次性完成,并且需要按照某种顺序(有点像分页) 3. 支持视图模型和绑定,我更喜欢使用一种视图模型来查看树,而不是直接查看树本身 4. 内置搜索和筛选支持,能够反映树形结构上匹配的内容 5. 准确、快速的滚动,并且可以选择移动到特定的元素(我更喜欢使用项目的视图模型表示)。
不想自己构建树,我在寻找现有实现,至少要支持虚拟化和数据虚拟化。
2个回答

3
我知道的最好的控件,可以满足您的要求,是Telerik RadTreeView。请查看演示。优点如下:
RadTreeView API支持UI虚拟化,仅处理可视区域中加载的信息,从而减少应用程序的内存占用并加快加载时间,进一步提高UI性能。
当操作大量项目时,Telerik RadTreeView控件的性能通过其按需加载功能得到显着优化。此机制允许节点在用户通过单击“+”图标展开父节点时加载其子节点。
RadTreeView是一个数据驱动的控件,旨在显示大量分层数据,并且它不会直接提供搜索、过滤和排序功能。因此,这些操作应该在它所表示的数据上实现。例如,请参见示例

感谢您的回答,希望能找到一个内置数据虚拟化支持的控件(我想要一些分页行为),类似于这样的东西:“http://www.devzest.com/blog/post/WPF-Data-Virtualization.aspx”,但是作为一个树形结构。 - Eli Dagan

2
我见过的最好的例子是Josh Smith的TreeView。它使用按需加载和文本搜索。
要包含DataVirtualization,您应该使用:
<TreeView
    VirtualizingStackPanel.IsVirtualizing = "True"
    VirtualizingStackPanel.VirtualizationMode = "Recycling" />

但要小心,虚拟化 仅在 TreeView 使用 绑定 时才有效,而不是像以下示例中一样逐个生成节点的代码:
TreeViewItem rootItem = new TreeViewItem() { Header = "Item Level 0" };

for (int i = 0; i < 1000; i++)
{
    TreeViewItem itemLevel1 = new TreeViewItem() { Header = "Item Level 1" };
    itemLevel1.Items.Add(new TreeViewItem());
    rootItem.Items.Add(itemLevel1);
}

更新:
您可以使用DevExpress TreeList控件。它是免费试用的。
或者Telerik的TreeView控件。它有30天的免费试用期。请查看他们的演示,您甚至可以下载并尝试它们。
更新1:
如果您对Josh Smith的TreeView的性能有任何疑问,那么我可以说一下我的经验:
  • 我有500个节点,加载这些项的时间为0.0003982秒
  • 我可以向上或向下滚动,没有任何冻结的UI(完美的数据虚拟化
  • 嵌套节点完美地打开,因为Josh Smith使用了惰性加载
  • 所有节点都可以有模板。因此,您可以设置任何您想要的图像或设计
  • 这个TreeView绝对不违反MVVM规则,因为它使用viewModels来控制TreeViewItems。这意味着,如果您在viewModel中有TreeViewItem,您将不会遇到奇怪的错误或异常。例如, this error

总之,我很高兴选择了JoshSmith的TreeView用于我的生产应用程序,因为它非常容易维护和编辑,并且具有非常出色的性能。

我的TreeView照片:

enter image description here


@EliDagan 你是对的。请仔细阅读我的回答。我写道:不是在代码中逐个生成节点时,就像以下示例一样 - StepUp
谢谢,但我需要对整个树进行虚拟化,而不仅仅是每个元素级别(就像TreeView的实现方式)。如果可能的话,我还需要数据虚拟化的内置支持,因为我需要每次加载树的不同块。 - Eli Dagan
@EliDagan 这些 VirtualizingStackPanel.IsVirtualizing = "True" VirtualizingStackPanel.VirtualizationMode ="Recycling" 行是为了整个树的数据虚拟化,所以每个元素级别都包括在内 :). 此外,Josh Smith的TreeView具有TextSearch功能。这就是你想要的全部内容。 - StepUp
@EliDagan 欢迎随时提出问题。如果您认为我的回复对您有帮助,您可以将其标记为答案以简化其他人未来的搜索。请阅读http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work。 - StepUp
正如我之前所说的,框架中的TreeView并不是一个可选项,因为当使用具有许多子节点的大型分层数据集时,它的性能非常差。(深度和广度树) 此外,我需要数据虚拟化,以便能够加载数据的不同部分并跟踪其已有数据和缺失数据。 我知道我可以自己构建它,但我想要一个已经存在的解决方案。 - Eli Dagan
嗨,我正在寻找已经尝试过免费或商业实现并且可以分享经验的人。 - Eli Dagan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接