如何使用DevExpress WPF组件实现异步加载TreeList节点?建议收藏

发布时间:2026/10/24 8:21:05
如何使用DevExpress WPF组件实现异步加载TreeList节点?建议收藏 DevExpress WPF拥有120个控件和库将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。DevExpress新旧版本帮助文档下载可进QQ qun获取169725316在本文中我们将详细介绍如何在DevExpress WPF TreeList控件和WPF Data Grid的TreeListView中异步加载树节点。当从一个服务中获取数据或加载一个有很多子记录的节点时应用程序可能会在节点扩展期间暂时“冻结”为了解决这个问题现在可以在后台线程中加载子节点。启用此选项后应用程序UI将在加载/展开操作期间保持响应。当加载信息时WPF TreeList控件将在屏幕上显示等待指示器。一旦完成节点将被展开等待指示器将被隐藏。要在下一个WPF项目中引入此功能请创建一个实现iasyncchildnodeselector接口的类并重写SelectChildrenAsync方法。当用户展开节点并允许开发人员在后台线程中加载子节点时选择器将调用此方法该方法返回一个Task对象(其中包含加载的子记录的集合)public class AsyncChildrenSelector : IAsyncChildNodesSelector { public Taskbool HasChildNode(object item, CancellationToken token) { throw new NotImplementedException(); } public IEnumerable SelectChildren(object item) { throw new NotImplementedException(); } public TaskIEnumerable SelectChildrenAsync(object item, CancellationToken token) { return Task.Run(async () { await Task.Delay(1000); return SelectChildNodes(item); }); } public IEnumerable SelectChildNodes(object item) { if (item is ProjectStage) return (item as ProjectStage).StageTasks; else if (item is ProjectObject) return (item as ProjectObject).ProjectStages; return null; } }接下来重写HasChildNode方法来检查加载的节点是否有子节点。当加载所有子节点时选择器调用此方法。该方法返回一个Task对象该对象包含一个布尔值(指示加载的节点是否包含子节点)。基于这个值WPF TreeList控件显示节点的展开按钮public class AsyncChildrenSelector : IAsyncChildNodesSelector { public Taskbool HasChildNode(object item, CancellationToken token) { return Task.Run(async () { await Task.Delay(250); return !(item is StageTask); }); } public IEnumerable SelectChildren(object item) { throw new NotImplementedException(); } public TaskIEnumerable SelectChildrenAsync(object item, CancellationToken token) { return Task.Run(async () { await Task.Delay(1000); return SelectChildNodes(item); }); } public IEnumerable SelectChildNodes(object item) { if (item is ProjectStage) return (item as ProjectStage).StageTasks; else if (item is ProjectObject) return (item as ProjectObject).ProjectStages; return null; } }开发人员可以允许最终用户取消任何加载操作为了响应用户的取消请求而取消加载操作调用SelectChildrenAsync或HasChildNode方法中的CancellationToken.ThrowIfCancellationRequested()方法。如果实现了WPF TreeList控件将在用户取消加载操作时显示一个重试按钮。这个“refresh”按钮允许用户重新启动操作public class CustomChildrenSelector : IAsyncChildNodesSelector { public Taskbool HasChildNode(object item, CancellationToken token) { return Task.Run(async () { for (int i 0; i 10; i) { token.ThrowIfCancellationRequested(); await Task.Delay(25); } return !(item is StageTask); }); } public IEnumerable SelectChildren(object item) { throw new NotImplementedException(); } public TaskIEnumerable SelectChildrenAsync(object item, CancellationToken token) { return Task.Run(async () { for (int i 0; i 10; i) { token.ThrowIfCancellationRequested(); await Task.Delay(100); } return SelectChildNodes(item); }); } public IEnumerable SelectChildNodes(object item) { if (item is ProjectStage) return (item as ProjectStage).Tasks; else if (item is ProjectObject) return (item as ProjectObject).Stages; return null; } }将TreeListView.TreeDerivationMode属性设置为ChildNodesSelector然后将创建的类实例分配给TreeListView.ChildNodesSelector属性dxg:TreeListControl ... dxg:TreeListControl.Resources local:AsyncChildrenSelector x:KeychildrenSelector/ /dxg:TreeListControl.Resources dxg:TreeListControl.View dxg:TreeListView TreeDerivationModeChildNodesSelector ChildNodesSelector{StaticResource childrenSelector}/ /dxg:TreeListControl.View /dxg:TreeListControl

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询