wpf研究之道-ProgressBar(进度条)控件
ProgressBar控件,非常有用。它在什么情况下有用呢?如何使用?带着这两个问题,我们探讨下。
如果程序需要很长时间来运行,用户在不知道的情况下,以为程序已经“卡死”了,没有响应,这时候就该用进度条了,它主动告诉用户的执行情况,那么用户知道还需要等待多久。
上面的使用场景,很好理解,那么,如何使用呢?
一边要执行长任务,一边还要不断地显示当前进度。这时候就得用多线程了,有人说那我就用单线程怎么了,那么咱们试一试便知道了。看如下的代码:
private void progressTest_Click(object sender, RoutedEventArgs e)
{
this.myBar.Minimum = ;
this.myBar.Maximum = ;
Computer(); } private void Computer()
{
for (int i = ; i <= ; i++)
{
var num = i; this.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
(ThreadStart)delegate()
{
this.myBar.Value = num / (double); }); Thread.Sleep();
}
}
我们模拟了一个小循环,里面耗费一些时间,运行的过程,一直是这样的:

等程序运行完成后的结果:

换句话说,我们的进度条多此一举,没有起到进度变化的效果。我把程序改成多线程的:
private void progressTest_Click(object sender, RoutedEventArgs e)
{
this.myBar.Minimum = ;
this.myBar.Maximum = ; Thread t = new Thread(() =>
{
Computer();
});
t.Start(); } private void Computer()
{
for (int i = ; i <= ; i++)
{
var num = i; this.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
(ThreadStart)delegate()
{
this.myBar.Value = num / (double); }); Thread.Sleep();
}
}
运行图如下:

为什么会出现这种情况?
一个人专心致志地做某件事情,如果中途不停地有人来打扰,是不是事情就没法做了呢。同理,如果当前的线程正在跑大任务,还要不停地刷新进度条。这个是不是很浪费执行的效率?所以我觉得从设计的角度理解,不允许单线程这样做。从第一组图中,就可以看出,单线程专心致志地做完事情后,才去更新界面。
公交车司机一边开车,到了某一站后,也不是亲自报站,而报站的任务落在了售票员身上,如果无售票员,那么司机按下系统按钮,让公交车上的报站设备去报。程序中往往运行大任务的是新开的另一个线程,此时主线程负责刷新界面,即刷新进度。
wpf研究之道-ProgressBar(进度条)控件的更多相关文章
- [转载]ExtJs4 笔记(8) Ext.slider 滚轴控件、 Ext.ProgressBar 进度条控件、 Ext.Editor 编辑控件
作者:李盼(Lipan)出处:[Lipan] (http://www.cnblogs.com/lipan/)版权声明:本文的版权归作者与博客园共有.转载时须注明本文的详细链接,否则作者将保留追究其法律 ...
- ExtJs4 笔记(8) Ext.slider 滚轴控件、 Ext.ProgressBar 进度条控件、 Ext.Editor 编辑控件
本篇要登场的有三个控件,分别是滚轴控件.进度条控件和编辑控件. 一.滚轴控件 Ext.slider 1.滚轴控件的定义 下面我们定义三个具有代表意义滚轴控件,分别展示滚轴横向.纵向,以及单值.多值选择 ...
- EasyUI - Progressbar 进度条控件
效果: html代码: <div id="p" style="width:400px;"></div> JS代码: $(function ...
- Photoshop和WPF双剑配合,打造炫酷个性的进度条控件
现在如果想打造一款专业的App,UI的设计和操作的简便性相当重要.UI设计可以借助Photoshop或者AI等设计工具,之前了解到WPF设计工具Expression Blend可以直接导入PSD文件或 ...
- 示例:WPF中Slider控件封装的缓冲播放进度条控件
原文:示例:WPF中Slider控件封装的缓冲播放进度条控件 一.目的:模仿播放器播放进度条,支持缓冲任务功能 二.进度: 实现类似播放器中带缓存的播放样式(播放区域.缓冲区域.全部区域等样式) 实现 ...
- C# 根据BackgroundWoker异步模型和ProgressBar控件,自定义进度条控件
前言 程序开发过程中,难免会有的业务逻辑,或者算法之类产生让人能够感知的耗时操作,例如循环中对复杂逻辑处理;获取数据库百万乃至千万级数据;http请求的时候等...... 用户在使用UI操作并不知道程 ...
- [K/3Cloud]进度条控件编程接口
进度条控件编程接口 1.启动进度查询 this.GetControl<ProgressBar>().Start(2) //每2秒查询一次进度 2.汇报进度 在插件中重载 OnQueryP ...
- WPF教程002 - 实现Step步骤条控件
原文:WPF教程002 - 实现Step步骤条控件 在网上看到这么一个效果,刚好在用WPF做控件,就想着用WPF来实现一下 1.实现原理 1.1.该控件分为2个模块,类似ComboBox控件分为Ste ...
- DevExpress的进度条控件ProgressBarControl的使用-以ZedGraph添加曲线进度为例
场景 Winform控件-DevExpress18下载安装注册以及在VS中使用: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1 ...
- 用 CALayer 定制下载进度条控件
// // RPProgressView.h // CALayer定制下载进度条控件 // // Created by RinpeChen on 16/1/2. // Copyright © 2016 ...
随机推荐
- C++ 函数模板“偏特化”
模板是C++中很重要的一个特性,利用模板可以编写出类型无关的通用代码,极大的减少了代码量,提升工作效率.C++中包含类模板.函数模板,对于需要特殊处理的类型,可以通过特化的方式来实现特定类型 ...
- Redis常见七种使用场景(PHP实战)
edis 是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. 本篇文章,主要介绍利用Redis常见应用场景下PHP实战. ...
- 【记录】.net 通用log4net日志配置
asp.net mvc 1.引入log4netNuGet包. 2.修改Global.asax下的Application_Start方法.加入log4net.Config.XmlConfigurator ...
- lamp环境部署脚本
关于lamp环境的安装脚本,直接复制即可使用 注:apache2.2.X 版本和apache2.4.X版本 本人推荐兼容性版本安装 apache2.4.25 + apr1.5.2 + apr-util ...
- 解决hadoop中 bin/hadoop fs -ls ls: `.': No such file or directory问题
出现这样的问题确实很苦恼...使用的是2.7版本..一般论坛上的都是1.x的教程,搞死人 在现在的2.x版本上的使用bin/hadoop fs -ls /就有用 应该使用绝对路径就不会有问题.... ...
- Activiti中的log4j(slf4j)的配置
今天试了一下在Activiti中使用log4j来进行配置发现这个会出现问题,其实Activiti中的日志系统是采用的是slf4j而不是log4j 然后使用slf4j驱动log4j来做的 通过Proce ...
- Nexus3将本地jar包添加到仓库
新建一个文件夹,将要上传的jar包放进去,然后创建一个pom文件,例如xx.jar,pom.xml 首先创建一个目录 方便执行上传的时候url参数 也可以不创建, 上传XML curl -v -u a ...
- 3.3 for 循环
Python 编程中 for循环用来遍历序列类型的对象,逐一取出序列中的元素值,每取出一个元素值就执行一次循环体,直到元素取完,循环结束.循环体中的代码块可以和序列中的元素值一点关系都没有,因为for ...
- 剑指offer第四天
25.复杂链表的复制 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的 ...
- PAT1001 A+B Format
思路:每三位分割,注意符号,首位不要出现逗号. AC代码 #include <stdio.h> #include <algorithm> using namespace std ...