Winform中封装DevExpress的MarqueeProgressBarComtrol实现弹窗式进度条效果
场景
在Winform中实现弹窗式进度条

就是新建一个窗体,然后在窗体中加入进度条控件,然后在触发进度条的事件中将加载进度报告给
进度条控件。
注:
博客主页:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。
实现
设计进度条窗体
新建窗体FrmProgressBar,打开设计页面,打开DevExpress的工具箱。
拖拽一个SplashScreen控件

然后再拖拽一个label和MarqueeProgressBarControl控件

然后打开其代码页面,编辑其代码为
public partial class FrmProgressBar : SplashScreen
{
#region 单例实现
private static string _lockFlag = "FrmProgressBarLock";
private static FrmProgressBar _instance = null; /// <summary>
/// 进度条窗口实例
/// </summary>
public static FrmProgressBar Instance
{
get
{
lock(_lockFlag)
{
if (_instance == null)
{
_instance = new FrmProgressBar(true);
}
else if (_instance.IsDisposed)
{
_instance = null;
_instance = new FrmProgressBar(true);
}
return _instance;
}
}
} #endregion #region 字段定义 private bool _isShowTitle = false; #endregion #region 构造方法 private FrmProgressBar()
{
InitializeComponent();
} private FrmProgressBar(bool isShowTitle)
{
InitializeComponent();
this._isShowTitle = isShowTitle;
this.marqueeProgressBarControl1.Properties.ShowTitle = this._isShowTitle;
} #endregion #region 属性定义 /// <summary>
/// 是否显示标题
/// </summary>
public bool IsShowTitle
{
get
{
return this._isShowTitle;
}
set
{
this._isShowTitle = value;
this.marqueeProgressBarControl1.Properties.ShowTitle = this._isShowTitle;
}
} /// <summary>
/// 提示文本
/// </summary>
public string NotifyText
{
get
{
return this.labelControl2.Text;
}
set
{
this.labelControl2.Text = value;
}
} /// <summary>
/// 进度值
/// </summary>
public int ProgressValue
{
get
{
return (int)this.marqueeProgressBarControl1.EditValue;
}
set
{
this.marqueeProgressBarControl1.Text = String.Format("{0}%", value);
}
} #endregion #region Overrides public override void ProcessCommand(Enum cmd, object arg)
{
base.ProcessCommand(cmd, arg);
} #endregion public enum SplashScreenCommand
{
}
}
调用进度条窗体
需要新开一个线程去执行进度条所代表的任务,在触发进度条的事件中
BackgroundWorker bgWorker = new BackgroundWorker();
并且设置其是否报告进度属性为true
bgWorker.WorkerReportsProgress = true;
然后绑定具体的进度条所代表的任务
bgWorker.DoWork -= backgroundWorker1_DoWork;
bgWorker.DoWork += backgroundWorker1_DoWork;
在此绑定的方法中就会执行具体的任务
然后设置任务进度改变的事件绑定
bgWorker.ProgressChanged -= bgWorker_ProgressChanged;
bgWorker.ProgressChanged += bgWorker_ProgressChanged;
在此方法中进行进度条进度与任务执行进度的绑定
private void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
if (e.ProgressPercentage >= && e.ProgressPercentage <= )
{
Dialog.FrmProgressBar.Instance.ProgressValue = e.ProgressPercentage;
}
}
然后设置任务执行完之后关闭进度条窗口
bgWorker.RunWorkerCompleted -= bgWorker_RunWorkerCompleted;
bgWorker.RunWorkerCompleted += bgWorker_RunWorkerCompleted;
在执行完的方法中
private void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Dialog.FrmProgressBar.Instance.Dispose(); //关闭进度对话框
}
然后开始执行后台操作
bgWorker.RunWorkerAsync();
然后最后让进度条窗体显示
Dialog.FrmProgressBar.Instance.ShowDialog();
需要注意的是:
在DoWork 中绑定的具体的执行的任务中一定是佷费时间的任务,如果就是简单的
几个for循环,那么会看不到效果,因为这两个线程没有时间差,所以会同时显示与关闭。
所以在具体执行的后台任务中要执行有时间差的任务,比如读取大数据量文件。
并且在执行此任务时要根据执行的任务进度去进行报告。
在DoWork绑定的方法中
BackgroundWorker bgWorker = sender as BackgroundWorker; 。。。 bgWorker.ReportProgress(); //10% 。。。 bgWorker.ReportProgress(); 。。。 bgWorker.ReportProgress();
完整示例代码
//创建新的后台线程
BackgroundWorker bgWorker = new BackgroundWorker();
//设置线程是否报告进度为true
bgWorker.WorkerReportsProgress = true;
//绑定具体的后台任务的方法,在此方法中会报告进度
bgWorker.DoWork -= backgroundWorker1_DoWork;
bgWorker.DoWork += backgroundWorker1_DoWork;
//当进度改变时事件绑定,将绑定的进度作为进度条的进度
bgWorker.ProgressChanged -= bgWorker_ProgressChanged;
bgWorker.ProgressChanged += bgWorker_ProgressChanged;
//后台线程执行完事件绑定,会关闭进度条窗口
bgWorker.RunWorkerCompleted -= bgWorker_RunWorkerCompleted;
bgWorker.RunWorkerCompleted += bgWorker_RunWorkerCompleted;
//开始执行后台操作
bgWorker.RunWorkerAsync();
//显示进度条窗口
Dialog.FrmProgressBar.Instance.ShowDialog();
执行后台任务的方法
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker bgWorker = sender as BackgroundWorker; List<Cycle> cycles = null;
List<Step> steps = null;
List<Record> mainRecords = null; bgWorker.ReportProgress(); //10% #region 加载循环数据 string cycleDataFile = String.Format("{0}{1}", Global.Instance.CurrDataFile, Global.CYCLE_EXT);
if (System.IO.File.Exists(cycleDataFile))
{
using (System.IO.Stream fs = new System.IO.FileStream(cycleDataFile, System.IO.FileMode.Open, System.IO.FileAccess.Read))
{
cycles = ProtoBuf.Serializer.Deserialize<List<Cycle>>(fs);
}
} bgWorker.ReportProgress(); #endregion #region 加载工步数据 string stepDataFile = String.Format("{0}{1}", Global.Instance.CurrDataFile, Global.STEP_EXT);
if (System.IO.File.Exists(stepDataFile))
{
using (System.IO.Stream fs = new System.IO.FileStream(stepDataFile, System.IO.FileMode.Open, System.IO.FileAccess.Read))
{
steps = ProtoBuf.Serializer.Deserialize<List<Step>>(fs);
}
} bgWorker.ReportProgress(); #endregion #region 加载主通道数据 string mainRecordDataFile = String.Format("{0}{1}", Global.Instance.CurrDataFile, Global.MAIN_EXT);
if (System.IO.File.Exists(mainRecordDataFile))
{
using (System.IO.Stream fs = new System.IO.FileStream(mainRecordDataFile, System.IO.FileMode.Open, System.IO.FileAccess.Read))
{
mainRecords = ProtoBuf.Serializer.Deserialize<List<Record>>(fs);
}
} #endregion bgWorker.ReportProgress(); }
后台任务进度改变事件
private void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
if (e.ProgressPercentage >= && e.ProgressPercentage <= )
{
Dialog.FrmProgressBar.Instance.ProgressValue = e.ProgressPercentage;
}
}
后台任务执行完毕事件
private void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Dialog.FrmProgressBar.Instance.Dispose(); //关闭进度对话框
}
Winform中封装DevExpress的MarqueeProgressBarComtrol实现弹窗式进度条效果的更多相关文章
- Winform中使用DevExpress时给控件添加子控件的方法
场景 在WInform中使用DevExpress时经常使用PanelControl控件用来进行布局设计,因此需要在代码中生成控件并添加子控件. 实现 一种是设置要添加的自控件的Parent属性为容器控 ...
- WPF弹出进度条
环境:vs2015 ,.net 4.6 源码地址:https://pan.baidu.com/s/1FoujUMst1luomPf0ZfCLUQ 提取码:trzj 说明: 1.进度条是在winFrom ...
- Android 中带有进度条效果的按钮(Button)
安卓中带有进度条效果的按钮,如下图: 1.布局文件如下activity_main.xml <RelativeLayout xmlns:android="http://schemas.a ...
- Winform中对DevExpress的RadopGroup的Description、Value、Tag、Text的理解与使用
场景 Winform中实现读取xml配置文件并动态配置ZedGraph的RadioGroup的选项: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article ...
- react封装简单的浏览器顶部加载进度条全局组件
在项目中经常会有在请求前后加loading或者加加载进度条,一般这些组件都会抽离出来作为全局组件 进度条的插件貌似都不是很符合自己项目中的需求,于是.. 参考nprogress样式,自己在项目中封装组 ...
- Android中通过线程实现更新ProgressDialog(对话进度条)
作为开发者我们需要经常站在用户角度考虑问题,比如在应用商城下载软件时,当用户点击下载按钮,则会有下载进度提示页面出现,现在我们通过线程休眠的方式模拟下载进度更新的演示,如图(这里为了截图方便设置对话进 ...
- 仿微信中加载网页时带线行进度条的WebView的实现
finddreams:http://blog.csdn.net/finddreams/article/details/44172639 为了仿微信中加载网页时带进度条的WebView的实现,首先我们来 ...
- 关于小程序 scroll-view中设置scroll-top无效 和小说图书阅读进度条小案例
在最近的项目有做到关于小说阅读的进度条功能,其中用到scroll-view和slider组件,发现scroll-view中的scroll-top在设置值后无效,出现这种情况大概是以下几种问题: 1.s ...
- Winform中使用DevExpress的CheckEdit控件实现多选条件搜索
场景 Winform控件-DevExpress18下载安装注册以及在VS中使用: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1 ...
随机推荐
- 微信小程序视图层介绍及用法
一. 视图层 WXML(WeiXin Markup Language)是框架设计的一套标签语言,结合基础组件.事件系统,可以构建出页面的结构. 1.1. 数据绑定 1.1.1. 普通写法 <vi ...
- Redis中几个简单的概念:缓存穿透/击穿/雪崩,别再被吓唬了
Redis中几个“看似”高大上的概念,经常有人提到,某些好事者喜欢死扣概念,实战没多少,嘴巴里冒出来的全是高大上的名词,个人一向鄙视概念党,呵呵! 其实这几个概念:缓存穿透/缓存击穿/缓存雪崩,有一个 ...
- UE4入门学习笔记开篇
做了3年的Unity, 现在开始转入到做UE4,一来就进入一个超大项目组中学习,度过了最初2个月的生涩和紧张后,现在准备开始慢慢总结,慢慢学习,逐步深入理解和研究UE. 做了3年的游戏开发后,个人感悟 ...
- Dubbo学习笔记-RPC扩展和本地Mock
1.Dubbo介绍 Dubbo,一个是一款高性能Java RPC框架.私以为有中文官方文档,就不再重复介绍了 2.RPC扩展-本地存根stub RPC扩展功能:提前效验参数,缓存调用结果,日志记录等等 ...
- Ansible-下部
ansible-playbook playbook是由一个或多个模块组成的,使用多个不同的模块,完成一件事情. ansible软件特点 可以实现批量管理可以实现批量部署ad-hoc(批量执行命令)- ...
- C++做四则运算的MFC计算器(一)MFC界面创建
学习最有效的方法就是实战,这两篇文章写了做MFC加减乘除计算器的过程. 第一写前台MFC界面搭建,第二写后台计算原理及代码. MFC编程参考教程:http://www.jizhuomi.com/sch ...
- 如何安装 IntelliJ IDEA 最新版本——详细教程
IntelliJ IDEA 简称 IDEA,被业界公认为最好的 Java 集成开发工具,尤其在智能代码助手.代码自动提示.代码重构.代码版本管理(Git.SVN.Maven).单元测试.代码分析等方面 ...
- PHP 字符串大全
PHP字符串函数是核心的一部分.无需安装即可使用这些函数 函数名称 描述 addcslashes 以 C 语言风格使用反斜线转义字符串中的字符 addslashes 使用反斜线引用字符串 bin2he ...
- Angular中innerHTML标签的样式不起作用详解
1.背景 在最近angular的项目中,需要用到[innerHTML]标签来指定一个div的样式: //HTML部分 <div class="contents" [inner ...
- css里的背景属性有哪些,如何去使用哪些属性
分类:纯色背景 背景图像 1.背景颜色 background-color : 任意合法的颜色 和 transparent 2.背景图像 background-image : url(想要加载的图 ...