示例:WPF中如何不卡顿页面的情况加载大量数据

一、目的:在开发过程中经常会遇到一个ListBox列表里面需要加载大量数据,但是加载过程中会假死卡顿影响用户体验,或者是你的主页面加载了大量控件,或者切换到一个有大量元素的页面都会有这种体验,因为加载的都是UI元素不能用多线程去处理,本文介绍一下应用BeginInvoke的方式加载的效果


二、实现

对于ListBox的加载大量数据

首先,想到的肯定是启用虚拟化,当然虚拟化是最佳选择,但有时布局或逻辑不允许应用VirtualizingStackPanel,或者是有些情况会破坏虚拟化。

其次,可以使用分页,将数据分成多页去展示(这种也是一种虚拟化)。

再者,就是应用尽量简单的元素去显示数据。

这里介绍的是BeginInvoke的方式,下面是不用虚拟化直接加载的效果

操作是生成10000个数据添加直接添加到ListBox的ItemsSource中,可以看到会卡住一段时间,如下是该功能代码 

            var data = Enumerable.Range(0, 10 * 1000);this.lb.ItemsSource = data;

 下面使用BeginInvok优化一下执行的效果如下

可以看到窗口很快加载出来不会出现假死,数据会逐步加载进来,如下是该功能代码

            var data = Enumerable.Range(0, 10 * 1000);ObservableCollection<int> beginInvokeDatas = new ObservableCollection<int>();this.lb.ItemsSource = beginInvokeDatas;foreach (var item in data){this.Dispatcher.BeginInvoke(() =>{beginInvokeDatas.Insert(0, item);}, DispatcherPriority.ApplicationIdle);}

实现方式是先new一个ObservableCollection<int>赋值给ListBox的ItemsSource,之后通过Foreach循环中应用BeginInvoke的方式插入到列表,其中DispatcherPriority参数也有很多种,调试过程中找到适合的就好。

当然这种插入方式也有弊端,就是相比一次性加载的时间要久一些,这个时候就需要根据需求去取舍。

上面提到的其他情况卡页面或假死,又用不了多线程和虚拟化的情况也可以参考这种方式去加载元素。

三、环境


VS2022

四、示例

五、需要了解的知识点

DispatcherPriority Enum (System.Windows.Threading) | Microsoft Learn 

Dispatcher Class (System.Windows.Threading) | Microsoft Learn

VirtualizingStackPanel 类 (System.Windows.Controls) | Microsoft Learn 

六、源码地址

GitHub - HeBianGu/WPF-ControlDemo: 示例

GitHub - HeBianGu/WPF-ControlBase: Wpf封装的自定义控件资源库

GitHub - HeBianGu/WPF-Control: WPF轻量控件和皮肤库

七、了解更多

System.Windows.Controls 命名空间 | Microsoft Learn

https://github.com/HeBianGu

HeBianGu的个人空间-HeBianGu个人主页-哔哩哔哩视频

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

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

相关文章

基于matlab的RRT算法路径规划(附带案例源码)

文章中的所有案例均为博主手动复现&#xff0c;用于记录博主学习路径规划的过程&#xff0c;如有不妥&#xff0c;欢迎在评论区交流 目录 1 标准RRT1.1 算法原理1.2 演示 2 GBRRT2.1 算法原理2.2 算法演示 3 RRT-STAR3.1 算法原理3.2 算法演示 4 RRT-CONNECT4.1 算法原理4.2 算…

流量有限、日活低的APP适合对接广告变现吗?

APP广告变现&#xff0c;总用户数和日活用户&#xff08;DUA&#xff09;是衡量APP价值和影响力的重要指标之一。 APP DUA过万&#xff0c;尤其是大几万时&#xff0c;通常具备了商业化价值&#xff0c;适合接入广告变现。日活1W意味着每天有1万名用户在使用这款应用&#xff…

了解指标体系1:指标是大数据开发中的关键要素

在大数据开发的过程中&#xff0c;指标体系是一个至关重要的概念。本文将介绍什么是指标&#xff0c;为什么它们如此重要&#xff0c;以及如何在大数据项目中有效地构建和应用指标体系。 目录 什么是指标&#xff1f;指标的类型为什么指标如此重要&#xff1f;如何构建有效的指…

Leetcode Java学习记录——代码随想录链表篇

文章目录 链表定义移除链表的倒数第n个结点判断[列表是否有环](https://leetcode.cn/problems/linked-list-cycle-ii/description/)报错java.lang.StackOverflowError空指针异常 链表定义 public class ListNode{int val;ListNode next;//三种构造函数public ListNode(){}publ…

Swift开发——存储属性与计算属性

Swift语言开发者建议程序设计者多用结构体开发应用程序。在Swift语言中,结构体具有了很多类的特性(除类的与继承相关的特性外),具有属性和方法,且为值类型。所谓的属性是指结构体中的变量或常量,所谓的方法是指结构体中的函数。在结构体中使用属性和方法是因为:①匹别于结…

宋老师讲课技巧笔记

1 如何发声 •发声的重要性 •上课三要素: 外表, 声音, 板书(PPT) •如何科学发声 ​ 反例&#xff1a;如果只用喉咙&#xff0c; 会很累 ​ 要点&#xff1a;发声从胸口开始进行发声 ​ 升级&#xff1a; 从腹腔&#xff0c;到胸膛&#xff0c;到喉咙发声&#xff0c; …

每日一练:攻防世界:miao~

给了一张jpg图片 没发现什么特别&#xff0c;放到winhex中查看也没思路。 放到kali里面foremost分离文件试试&#xff0c;结果分离出个wav音频文件 直接放到 audycity看看频谱图 发现字符串&#xff0c;但是没有其他信息。可能是密钥之类的。到这里我就卡住了&#xff0c;看…

镜像拉取失败:[ERROR] Failed to pull docker image

问题描述 执行 bash docker/scripts/dev_start.sh 命令提示错误&#xff1a; permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post “http://%2Fvar%2Frun%2Fdocker.sock/v1.45/images/create?fromImageregistry.b…

微信小程序-上拉加载和下拉刷新

一.上拉加载 微信小程序的上拉加载使用onReachBottom()&#xff0c;写在.js文件里面的Page方法里面。 onReachBottom(){//上拉自动更新到4&#xff0c;5&#xff0c;6wx.showLoading({title: 数据加载中...,})setTimeout(()>{const lastNumthis.data.numList[this.data.nu…

webpack 中 require.context() 的用法

一、什么是 require.context It allows you to pass in a directory to search, a flag indicating whether subdirectories should be searched too, and a regular expression to match files against. – webpack 官方说明 一个 webpack 的 api &#xff0c;通过该函数可以获…

类加载机制-打破双亲委派机制

文章目录 类加载机制打破打破双亲委派机制例子1例子2 类加载机制 类加载机制 打破打破双亲委派机制 例子1 JDBC的加载机制 Driver 接口是在rt.jar 包里定义的 public interface Driver {Connection connect(String url, java.util.Properties info)throws SQLException; }…

Java中Cookie的用法

Cookie是一段不超过4KB的小型文本数据&#xff0c;由一个名称&#xff08;Name&#xff09;、一个值&#xff08;Value&#xff09;和其它几个用于控制Cookie有效期、安全性、使用范围的可选属性组成。 Expires&#xff08;过期&#xff09; 设置Cookie的生存期。有两种存储类…

Ubuntu网络管理命令:nslookup

安装Ubuntu桌面系统&#xff08;虚拟机&#xff09;_虚拟机安装ubuntu桌面版-CSDN博客 nslookup命令主要用来查询域名信息&#xff0c;实际上主要是将域名转换为相应的IP地址&#xff0c;或者将IP地址转换成相应的域名。nslookup命令为用户提供了两种工作模式&#xff0c;分别…

删掉一个元素以后全为1的最长子数组

class Solution { public:int longestSubarray(vector<int>& nums) {int lennums.size();int left0,right0,cnt00;while(right<len){if(nums[right]0){cnt0;}right;if(cnt0>1){if(nums[left]0){cnt0--;}left;}}return right-left-1;} };

matlab线性多部法求常微分方程数值解

用Adamas内差二步方法&#xff0c;内差三步方法&#xff0c;外差二步方法&#xff0c;外差三步方法这四种方法计算。 中k为1和2. k为2和3 代码 function chap1_adams_methodu0 1; T 2; h 0.1; N T/h; t 0:h:T; solu exact1(t);f f1; u_inter_2s adams_inter_2steps(…

B类IP介绍

一、B类ip给谁用&#xff1a; 城域网用的大多就是B类地址。 二、基本介绍 ip地址范围 - 理论范围 128.0.0.0 ~ 191.255.255.255&#xff1a;10000000 00000000 00000000 00000000 ~ 10111111 11111111 11111111 11111111 - 实际&#xff08;正常情况&#xff09;可用地址范围…

2024-6-19(沉默springboot)

1.spring开启事务支持 事务在逻辑上是一组操作&#xff0c;要么执行&#xff0c;要不都不执行。主要是针对数据库而言的&#xff0c;比如说 MySQL。 业务场景eg: public void savePosts(PostsParam postsParam) {// 保存文章save(posts);// 处理标签insertOrUpdateTag(posts…

【C++】生成随机数

生成 l , r l,~r l, r 范围内的随机数 C o d e Code Code #include <iostream> #include <random> using namespace std;int get_rand(int l, int r) {random_device rd; // 用于获取随机数种子的设备mt19937 gen(rd()); // 以随机数种子初始化随机数生成器unif…

Leetcode 3187. Peaks in Array

Leetcode 3187. Peaks in Array 1. 解题思路2. 代码实现 题目链接&#xff1a;3187. Peaks in Array 1. 解题思路 这一题算是一个套路题&#xff0c;基本就是典型的segment tree的题目。 对于任意一个query&#xff0c;segment tree可以直接获得对应范围内的peak的数目&…

python使用多进程加快处理数据

最近需要用python循环遍历xlsx文件&#xff0c;但总感觉特慢&#xff0c;于是记录一下使用多进程让cpu性能拉满&#xff0c;加快速度。 python使用多进程加快处理数据 1.原始代码2.使用多进程改写代码 1.原始代码 下面展示 原始代码。 这个举例代码的是用来循环遍历我文件夹下…