WPF中定时器与进度条的配合使用
本篇博客涉及定时器,委托中多线程的使用,希望对大家有所帮助~~~
WPF中定时器使用的注意事项:
WPF需要使用System.Windows.Threading.DispatcherTimer定时器,而不能使用System.Timers.Timer定时器。因为System.Timers.Timer运行在非UI线程,如果不使用SynchronizingObject属性,则该定时器启动的 子线程与窗体不在一个线程,不能访问WPF窗体中的控件(运行时会报该对象已被其他线程占用的异常),只能通过dialing的方式来访问,而System.Windows.Threading.DispatcherTimer运行在UI线程中,可以访问WPF窗体中的控件。或者,在System.Timers.Timer定时器中使用this.Dispatcher切换到UI线程后使用Invoke或者BeginInvoke方法更新UI画面。
1.创建System.Timers.Timer定时器并初始化:
System.Timers.Timer timer;
private delegate SetProgress();//声明委托用于更新UI
public double value = 0; //进度条进度值
private delegate void AutoMJBuInfoMethod(string model, string pattern, Int32 orgid); //点击按钮使用委托 public MainWindow() {
InitializeComponent();
this.MJpbBar.Maximum = 100;
this.MJpbBar.Minimum = 0;
if (timer == null)
{
timer = new System.Timers.Timer();
timer.Interval = ;
timer.Elapsed += new ElapsedEventHandler(OnTick);;
}
}
private void OnTick(object sender, System.Timers.ElapsedEventArgs e)
{
timer.AutoReset = false; //是否只触发一次Elapsed法,false(次),true(重复)
timer.Enabled = false;//是否引发Elapsed事件
timer.stop();
ProgressBarAction(); //更新进度条方法
timer.AutoReset = true;
timer.Enabled= true;
timer.Start();
}
2.定时器执行方法(使用Invoke更新UI画面):
private bool ProgressBarAction()
{
this.Dispatcher.Invoke(DispatcherPriority.Normal, new SetProcess(updateUI)); MJpbBar.Dispatcher.Invoke(new Action<System.Windows.DependencyProperty, object>(MJpbBar.SetValue),
System.Windows.Threading.DispatcherPriority.Background, ProgressBar.ValueProperty, value);
}
3.更新UI方法:
private void UpdateUI()
{
value = (double)AUTOBUMJBusiness.FinishedMJCount * 100 / AUTOBUMJBusiness.TotalMJCount; //TotalMJCount为总计数量,FinishedMJCount为已完成数量 lblMJProcess.Content = "资料总条数:" + AUTOBUMJBusiness.TotalMJCount + ",已生成:" + AUTOBUMJBusiness.FinishedMJCount;
//执行结束后隐藏进度条
if (AUTOBUMJBusiness.TotalMJCount == AUTOBUMJBusiness.FinishedMJCount && AUTOBUMJBusiness.TotalMJCount > 0)
{
this.lblMJProcess.Visibility = Visibility.Hidden;
this.MJpbBar.Visibility = Visibility.Hidden;
this.btnMJ.Visibility = Visibility.Visible;
}
}
4.点击事件(点击按钮后执行另一个方法会堵塞线程,直到另一个线程执行结束,此时页面UI不会更新,所以此处使用委托开启另一条线程来执行这个方法):
private void btn_click(object sender, RoutedEventArgs e)
{ try
{
this.lblMJProcess.Visibility = Visibility.Visible;
this.MJpbBar.Visibility = Visibility.Visible;
this.btnMJ.Visibility = Visibility.Hidden;
AUTOBUMJBusiness oAUTOBUMJBusiness = new AUTOBUMJBusiness();
AutoMJBuInfoMethod oAuotoMJBuInfo = new AutoMJBuInfoMethod(oAUTOBUMJBusiness.DoAction);
oAuotoMJBuInfo.BeginInvoke(this.txtModel.Text.ToString().ToUpper().Trim(), this.txtPattern.Text.ToString().ToUpper().Trim(), Convert.ToInt32(this.txtOrgid.Text.ToString().Trim()), null, null);
}
catch (Exception ex)
{
_log.Info("转MainWindow程序出错" + ":" + ex.Message + "." + DateTime.Now);
}
}
在用户点击按钮后,主线程会被堵塞,直到点击事件中的DoAction全部执行完,才会执行下面的程序。因此会引发页面UI无法更新的问题,需要使用BeginInvoke方法来另开一条线程,用来执行DoAction方法,不会影响主线程的工作,从而不影响页面UI更新。
WPF中定时器与进度条的配合使用的更多相关文章
- WPF实现斜纹圆角进度条样式
原文:WPF实现斜纹圆角进度条样式 运行效果: 进度条样式: <!--进度条样式--> <LinearGradientBrush x:Key="ProgressBar.Pr ...
- android中SeekBar拖动进度条的使用及事件监听
下面和大家分享一下android中SeekBar拖动进度条的使用,以及事件监听.拖动进度条的事件监听需要实现SeekBar.OnSeekBarChangeListener接口,调用SeekBar的se ...
- (数据科学学习手札91)在Python中妥善使用进度条
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在日常运行程序的过程中常常涉及到循环迭代过程,对 ...
- WPF 自定义绕圈进度条
在设计界面时,有时会遇到进度条,本次讲解如何设计自定义的绕圈进度条,直接上代码: 1.控件界面 <UserControl x:Class="ProgressBarControl&quo ...
- Unity3D中灵活绘制进度条
有时我们需要在Unity3D中绘制进度条,如: 或 如果使用4.6版本以下的unity绘制环形的进度条可能需要费点劲.我搜到的大多数方法都是用NGUI插件,但有时只是 ...
- 用Raphael在网页中画圆环进度条
原文 :http://boytnt.blog.51cto.com/966121/1074215 条状的进度条我们见得太多了,实现起来比较简单,它总是长方形的,在方形的区域里摆 放就不太好看了.随着cs ...
- JQuery中简约的进度条插件推荐
JQuery Progress Bar是基于JQuery开发的进度条插件,秉承了JQuery的简约哲学.不仅容易使用,而且可以轻松定制外观.对于使用了JQuery框架的项目来说,需要使用进度条控件时这 ...
- 关于各种Vue UI框架中加载进度条的正确使用
这里拿MUSE UI 中的进度条举例 <mu-circular-progress :size="40" class="icon" v-if="i ...
- WPF 自定义绕圈进度条(转)
在设计界面时,有时会遇到进度条,本次讲解如何设计自定义的绕圈进度条,直接上代码: 1.控件界面 <UserControl x:Class="ProgressBarControl&quo ...
随机推荐
- WPF 查找控件的所有子控件
/// <summary> /// 查找子控件 /// </summary> /// <typeparam name="T">控件类型</ ...
- 20175205 2018-2019-2 《Java程序设计》第五周学习总结
20175205 2018-2019-2 <Java程序设计>第五周学习总结 教材学习内容总结 接口:使用关键字interface定义接口 接口声明:interface 接口名 接口体:接 ...
- 复制ASP.NET的ASHX、aspx文件的注意事项
在复制ashx文件后,需要在夫指出的文件上右键——打开方式——点击“”源代码文本编辑器“” ashx在你新建的时候它已经指定了执行的命名空间你后面再去修改文件名或者里边的类名它的指定也不会变 这是因 ...
- 数据库session立即生效(64---8192) SCOPE参数
SCOPE=MEMORY|SPFILE|BOTH 指示了修改参数时的“作用域”: SCOPE=MEMORY :只在实例中修改,重启数据库后此次修改失效. SCOPE=SPFILE :只修改SPFILE ...
- 用vue脚手架创建bootstrap-vue项目
用vue脚手架创建bootstrap-vue项目 框架的地址:https://bootstrap-vue.js.org/docs/ 第一步 vue init webpack demo第二步 cd de ...
- mySQL简单操作(三)
1.事务 (1)ACID 原子性(不可分割性)automicity 一致性 consistency 隔离性 isolation 持久性 durability (2)事务控制语句 begin/start ...
- javaScript数据类型的一些小细节
JavaScript的数据类型有哪些就不说了,没必要. 由于JavaScript是一个弱类型的语言,就是定义的时候不需要定义数据类型,数据类型自动根据变量值来确定.而在JavaScript里面,数据类 ...
- git遇到error: RPC failed; curl 18 transfer closed with outstanding read data remaining fatal: The remote end hung up unexpectedly fatal: early EOF fatal: index-pack failed failed怎么办?
答: 将clone地址中的https://替换成git://即可解决 如: 将https://git.openwrt.org/project/luci.git修改为git://git.openwrt. ...
- 纸小墨ink简洁主题story爱上你的故事
主题介绍 为纸小墨写的一款主题,该主题移植自Yumoe github地址:ink-theme-story Demo ink-theme-story 主题的一些食用说明 菜单 标题旁边有一个 · 字符, ...
- vi编辑器使用记录
01. vi 简介 1.1 学习 vi 的目的 在工作中,要对 服务器 上的文件进行 简单 的修改,可以使用 ssh 远程登录到服务器上,并且使用 vi 进行快速的编辑即可 常见需要修改的文件包括: ...