C# Wpf TreeView具有列,具有UI虚拟化和数据虚拟化

C# Wpf TreeView具有列,具有UI虚拟化和数据虚拟化,c#,wpf,treeview,wpf-controls,data-virtualization,C#,Wpf,Treeview,Wpf Controls,Data Virtualization,我正在寻找一个wpf控制(免费或商业)。 树应该支持所有常规的树视图特征(样式、数据模板、控件模板等),并支持使用列进行布局(有点像VisualStudio中的监视窗口) 而且: 良好的虚拟化-应支持数千个元素 内置数据虚拟化-数据的加载和处理速度很慢,不能一次按一定顺序完成(有点像分页) 视图模型支持和绑定,我更喜欢使用某种视图模型来研究树,而不是研究树本身 内置支持对数据表示进行搜索和筛选,然后在树的可视元素上反映匹配项 精确、快速滚动并选择移动到特定元素(我更喜欢使用项目的ViewMode

我正在寻找一个wpf控制(免费或商业)。 树应该支持所有常规的树视图特征(样式、数据模板、控件模板等),并支持使用列进行布局(有点像VisualStudio中的监视窗口)

而且:

  • 良好的虚拟化-应支持数千个元素
  • 内置数据虚拟化-数据的加载和处理速度很慢,不能一次按一定顺序完成(有点像分页)
  • 视图模型支持和绑定,我更喜欢使用某种视图模型来研究树,而不是研究树本身
  • 内置支持对数据表示进行搜索和筛选,然后在树的可视元素上反映匹配项
  • 精确、快速滚动并选择移动到特定元素(我更喜欢使用项目的ViewModel表示)

  • 我不想自己构建树,我正在寻找至少支持虚拟化和数据虚拟化的现有实现。

    我见过的最好的例子是。它使用按需加载和文本搜索

    要包括
    数据虚拟化
    ,您应该使用:

    <TreeView
        VirtualizingStackPanel.IsVirtualizing = "True"
        VirtualizingStackPanel.VirtualizationMode = "Recycling" />
    
    更新:

    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);
    }
    
    你可以使用控制。这是免费试用

    或控制。这是30天的免费试用。 看到他们的演示,你甚至可以下载并试用

    更新1:

    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);
    }
    
    如果您对性能有任何疑问,那么我可以谈谈我的经验:

    • 我有500个节点,加载这些项目的时间是0.0003982秒
    • 我可以上下滚动,没有任何冻结的UI(完美的数据虚拟化
    • 当Josh Smith使用延迟加载时,嵌套节点完全打开
    • 所有节点都可以有模板。因此,您可以设置任何您想要的图像或设计
    • TreeView
      并不完全违反MVVM规则,因为它使用
      viewModels
      作为
      TreeViewItems
      。这意味着如果在
      viewModel
      中有
      treevieItem
      ,您将不会遇到奇怪的错误或异常。例如
    最后,我想说,我真的很高兴在我的生产应用程序中选择了JoshSmith的
    TreeView
    ,因为支持和编辑它非常简单。它的表现真的很棒

    my
    TreeView的照片


    据我所知,谁能应用您的需求,最好的控制方法是。看看这本书。优点:

    RadTreeView API支持UI虚拟化,它只处理加载在可视区域中的信息,从而减少应用程序的内存占用,加快加载时间,从而进一步提高UI性能

    Telerik RadTreeView控件在处理大量项目时的性能通过其按需加载功能得到显著优化。此机制允许节点在用户通过单击“+”图标展开父节点时加载其子节点

    RadTreeView是一种数据驱动控件,旨在显示大量分层数据,它不提供现成的搜索、筛选和排序功能。因此,
    操作应该在它所代表的数据上实现

    @EliDagan你说得对。请仔细阅读我的答案。我已经写过:不是像下面的例子那样在代码中一个接一个地生成节点,谢谢,但是我需要在所有树上进行虚拟化,而不仅仅是针对每个元素级别(比如TreeView实现)。我还需要一个数据虚拟化(如果可能的话,一个内置的支持),因为我需要加载每个树的不同块time@EliDagan这些virtualzingstackpanel.isvirtualization=“True”virtualzingstackpanel.VirtualizationMode=“Recycling”行用于整个树的数据虚拟化,因此包含元素的每个级别:)。此外,Josh Smith的TreeView还有文本搜索功能。这就是你想要的一切。@EliDagan可以随意问任何问题。如果您觉得我的回复对您有帮助,那么您可以将我的回复标记为答案,以简化将来对其他人的搜索。请像我之前说的那样读这个。框架中的TreeView不是可选的,因为当它与一大组分层数据(其每个节点都有很多子节点)一起使用时,它的性能非常差。(深广树)我还需要数据虚拟化,使我能够加载数据的不同部分,并跟踪它拥有的数据和丢失的数据。我知道我可以自己构建,但我想要现有的解决方案。感谢您的回答。希望找到一个内置支持数据虚拟化的控件。(我想有某种分页行为)比如:“但是,作为一棵树