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

news2024/11/15 12:44:30

DevExpress WPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。

在本文中,我们将详细介绍如何在DevExpress WPF TreeList控件和WPF Data Grid的TreeListView中异步加载树节点。

DevExpress WPF v22.1正式版下载(Q技术交流:674691612)

当从一个服务中获取数据或加载一个有很多子记录的节点时,应用程序可能会在节点扩展期间暂时“冻结”,为了解决这个问题现在可以在后台线程中加载子节点。启用此选项后,应用程序UI将在加载/展开操作期间保持响应。

当加载信息时,WPF TreeList控件将在屏幕上显示等待指示器。一旦完成,节点将被展开,等待指示器将被隐藏。

要在下一个WPF项目中引入此功能,请创建一个实现iasyncchildnodeselector接口的类,并重写SelectChildrenAsync方法。当用户展开节点并允许开发人员在后台线程中加载子节点时,选择器将调用此方法,该方法返回一个Task对象(其中包含加载的子记录的集合):

public class AsyncChildrenSelector : IAsyncChildNodesSelector {
public Task<bool> HasChildNode(object item, CancellationToken token) {
throw new NotImplementedException();
}

public IEnumerable SelectChildren(object item) {
throw new NotImplementedException();
}

public Task<IEnumerable> 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 Task<bool> 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 Task<IEnumerable> 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 Task<bool> 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 Task<IEnumerable> 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:Key="childrenSelector"/>
</dxg:TreeListControl.Resources>
<dxg:TreeListControl.View>
<dxg:TreeListView TreeDerivationMode="ChildNodesSelector"
ChildNodesSelector="{StaticResource childrenSelector}"/>
</dxg:TreeListControl.View>
</dxg:TreeListControl>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/187912.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PADS Layout封装创建时批量放置焊盘的方法

批量放置焊盘一般是在BGA封装的是用的比较多&#xff0c;当然对于一些普通贴片焊盘也是挺常用的。 1、第一步&#xff1a;打开PCB封装编辑器&#xff0c;进入到封装编辑界面&#xff0c;放置焊盘后&#xff0c;点击焊盘右键“分步与重复”既可。2、第二步&#xff1a;点击以后弹…

常见的锁策略和synchronized的锁机制

文章目录一. 常见的锁策略1. 乐观锁和悲观锁2. 轻量级锁和重量级锁3. 自旋锁和挂起等待锁4. 普通互斥锁和读写锁5. 公平锁和非公平锁6. 可重入锁和不可重入锁二. synchronized的锁机制1. 锁升级/锁膨胀2. 锁消除3. 锁粗化一. 常见的锁策略 1. 乐观锁和悲观锁 乐观锁和悲观锁主…

C++ | 数据结构与算法 | 最小生成树算法讲解 | Kruskal Prim

文章目录前言Kruskal算法Prim算法前言 讲解之前&#xff0c;我们需要先明白连通图是指什么&#xff1f;连通图具有以一个顶点为起点可以到达该图中的任意一个顶点的特性&#xff0c;就算它们不直接相连&#xff0c;但是它们之间至少有一条可以递达的路径。并且连通图是针对无向…

劳务派遣协议范本整理版模板范本

劳务派遣协议范本整理版 甲方&#xff08;用工单位&#xff09;&#xff1a;______ 法定代表人&#xff1a;____________ 地址&#xff1a;__________________ 电话&#xff1a;__________________ 传真&#xff1a;__________________ 乙方&#xff08;派遣单位&#xf…

【Java】一文彻底弄懂访问修饰符(public/protected/默认/private)--建议收藏

博主简介&#xff1a;努力学习的预备程序媛一枚~博主主页&#xff1a; 是瑶瑶子啦所属专栏: Java岛冒险记【从小白到大佬之路】 前言 OOP(Object Oriented Programing)&#xff0c;即面向对象编程&#xff0c;最重要的功能/特点之一就是封装&#xff0c;这点在该专栏开篇博客【…

WebPack面试题汇总

1&#xff0c;Webpack有什么作用&#xff0c;谈谈你对它的理解 现在的前端网页功能丰富&#xff0c;特别是SPA&#xff08;single page web application 单页应用&#xff09;技术流行后&#xff0c;JavaScript的复杂度增加和需要一大堆依赖包&#xff0c;还需要解决Scss、Les…

记录--这样封装列表 hooks,一天可以开发 20 个页面

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 这样封装列表 hooks,一天可以开发 20 个页面 前言 在做移动端的需求时&#xff0c;我们经常会开发一些列表页&#xff0c;这些列表页大多数有着相似的功能&#xff1a;分页获取列表、上拉加载、下拉刷…

【Java 面试题合集】ThreadPoolExecutor 线程池面试题

文章目录自定义的线程池的 7 个参数如何合理设置核心线程数 corePoolSize 的大小《JAVA 并发编程实战》中的方案java 开发手册中为什么不允许使用 Executors 默认的实现&#xff1f;一个线程池中的线程异常了&#xff0c;那么线程池会怎么处理这个线程?线程池被创建后里面有线…

OpenCV——总结《图像处理-1》

1.HSV H - 色调&#xff08;主波长&#xff09;。S - 饱和度&#xff08;纯度/颜色的阴影&#xff09;。V值&#xff08;强度&#xff09; hsvcv2.cvtColor(img,cv2.COLOR_BGR2HSV)2.图像阈值 函数介绍&#xff1a; ret, dst cv2.threshold(src, thresh, maxval, type) sr…

嵌入式Linux从入门到精通之第九节:系统编程

系统编程概述 在讲解系统编程之前,先了解几个概念: 操作系统的作用: 操作系统用来管理所有的资源,并将不同的设备和不同的程序关联起来。 什么是Linux系统编程? 在有操作系统的环境下编程,并使用操作系统提供的系统调用及各种库,对系统资源进行访问。 学会了C语言再知…

Grafana9.3.x在windows上的安装及使用

Grafana9.3.x的安装及使用1. Grafana install1.1 Download1.2 Install2. User Guide1.1 Document1.2 Table视图背景色渲染3.Awakening1. Grafana install 1.1 Download 下载地址 Grafana Website: https://grafana.com/. 1.2 Install 直接点击安装就好了 进入conf目录复制一…

python集合语法与应用

python集合语法与应用 文章目录python集合语法与应用一、实验目的二、实验原理三、实验环境四、实验内容五、实验步骤1.创建2.增加3.删除4.集合运算5.拓展知识一6.拓展知识二总结一、实验目的 掌握集合的用法 二、实验原理 集合中只能包含数字、字符串、元组等不可变的类型的…

规则引擎,实现业务低代码开发的重要工具

规则引擎&#xff0c;是将业务执行抽象化的配置&#xff0c;通过其定义的数据结构、算法和流程来实现应用程序功能的普适化。 规则引擎可以帮助企业提高业务开发效率&#xff0c;提高运营的灵活性&#xff0c;降低运营成本与开发成本&#xff0c;让系统更加智能化灵活化。这里以…

【Rust】5. 所有权

5. 所有权 5.1 什么是所有权 5.1.1 栈&#xff08;Stack&#xff09;与堆&#xff08;Heap&#xff09; 5.1.2 所有权规则 5.1.3 变量作用域 5.1.4 String 类型 String 类型可进行修改&#xff0c;而字符串字面值是不可以的&#xff01;&#xff08;区别在于二者对内存的处理…

OAuth2

目录一、什么是OAuth2.0二、OAuth2中的角色三、认证流程四、生活中的Oauth2思维5. 令牌的特点6.OAuth2授权方式6.1 授权码6.2 隐藏方式6.3 密码方式6.4 凭证方式一、什么是OAuth2.0 OAuth2.0是目前使用非常广泛的授权机制&#xff0c;用于授权第三方应用获取用户的数据。 举例…

PythonWeb Django框架学习笔记

文章目录Django一、初步了解Django1.1 创建项目1.2 文件介绍1.3 APP的创建和说明添加新的app注册app创建页面1.4 templates模板templates语法单一变量列表循环【列表】字典循环【字典】列表套字典条件判断templates小结1.5 请求和响应案例&#xff1a;用户管理二、数据库操作2.…

前言技术之mybatis-plus 01

目录 1.什么是mybatis-plus 2.初体验 3.日志 4.主键生成策略 5.更新 6.自动填充 1.什么是mybatis-plus 升级版的mybatis&#xff0c;目的是让mybatis更易于使用&#xff0c; 用官方的话说“为简化而生” 官网&#xff1a; MyBatis-Plus 2.初体验 1.准备数据库脚本 数据…

再获殊荣!天云数据入选第一批北京市级企业技术中心,Hubble数据库提供新一代信息技术科技服务

为助力北京国际科技创新中心建设&#xff0c;贯彻落实北京市“十四五”时期高精尖产业发展规划&#xff0c;引导和支持企业加强创新能力&#xff0c;培育和引导企业技术中心建设&#xff0c;北京市经济和信息化局组织开展了2022年度第一批北京市市级企业技术中心的创建工作&…

【Python学习笔记】5. Python3 基本数据类型(上)——数值型、字符串型

前言 Python 中的变量不需要声明。每个变量在使用前都必须赋值&#xff0c;变量赋值以后该变量才会被创建。 Python3 基本数据类型 Python 中的变量不需要声明。每个变量在使用前都必须赋值&#xff0c;变量赋值以后该变量才会被创建。 在 Python 中&#xff0c;变量就是变…

tomcat配置多个host,并且避免重复加载

目录 1.实验描述 2.实验环境 2.实验过程 2.1 创建order和user项目 2.2 打包项目 2.3 修改tomcat的server.xml的配置 2.4 启动tomcat 2.5 配置本地host 2.6 验证 1.实验描述 目前有两个域名&#xff0c;分别是&#xff1a; order.abc.com user.abc.com 两个项目&…