WPF邮件群发工具开发 之 进度条(属性改变通知机制)的实现
2013-02-06 11:49
453 查看
前段时间,抽空用WPF做了个邮件群发工具;接下来想用两三篇博客将开发过程中遇到的困惑和积累的经验跟大家分享下,也算是抛砖引玉了,尽管对WinForm开发很熟悉,但毕竟它们之间差别比较大——从界面的呈现到内部的控制等。本篇博客看标题就可清楚,我要说的是进度条(属性改变通知机制)的实现!
进度条在WinForm中实现很容易,代码如下:
看似正常的逻辑,在WPF中却没有效果,其原因经测试和分析得出:应该是WinForm里控件和界面在同一个线程中,而WPF里它们不在同一个线程中。
现在切入正题,谈谈WPF中进度条(属性改变通知机制)的实现——
发送结果信息实体类
界面上的使用
图001
通过上面的代码,可以看出SendResult类实现了INotifyPropertyChanged——此接口的用途是向客户端发出某一属性值已更改的通知,这个接口的定义很简单,如下:
此接口中只有一个PropertyChanged事件的定义,顾名思义:此事件会在属性值发生改变时被触发调用,且不需要实现,我比较好奇其内部的具体实现。重点看图001中的红色和紫色区域,通过{Binding 属性名}的方式分别设置了进度条的当前值和发送按钮的可用状态,而{Binding 属性名}的用法在WPF中很普遍,其使用有点儿类似于WebForm中的数据绑定控件中的<%#Eval("属性名")>,既然是类似,那同样的还需要给控件设置一个类似DataSource的东东——使控件的数据绑定和具体的数据对象关联起来,才能实现相应的功能。
上面的代码就相当于是设置progressBar的数据源,只不过在WPF中它有另外一个名称叫:DataContext 数据上下文,几乎所有的WPF控件都有DataContext此属性,即都支持数据绑定。
到这里,进度条的实现已OK,效果图如下:
因为对WPF根本谈不上精通,如果有错解的地方,希望大家能指出或谈下自己的看法,感兴趣的朋友,可以留言相互交流学习!
进度条在WinForm中实现很容易,代码如下:
private void button1_Click(object sender, EventArgs e) { int num = 100; this.progressBar1.Maximum = num; for (int i = 0; i <= num; i = i + 10) { this.progressBar1.Value = i; Thread.Sleep(1000); } }
看似正常的逻辑,在WPF中却没有效果,其原因经测试和分析得出:应该是WinForm里控件和界面在同一个线程中,而WPF里它们不在同一个线程中。
现在切入正题,谈谈WPF中进度条(属性改变通知机制)的实现——
发送结果信息实体类
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ComponentModel; namespace EmailBatchSend { /// <summary> /// 发送结果信息实体 /// </summary> internal class SendResult : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private string _progressBarNumShow = string.Empty; /// <summary> /// 进度条数字显示 /// </summary> public string ProgressBarNumShow { get { return this._progressBarNumShow; } set { this._progressBarNumShow = value; OnPropertyChanged("ProgressBarNumShow"); } } private string _sendResultMes = string.Empty; /// <summary> /// 发送结果消息 /// </summary> public string SendResultMes { get { return this._sendResultMes; } set { this._sendResultMes = value; OnPropertyChanged("SendResultMes"); } } private string _sendFailEmails = string.Empty; /// <summary> /// 发送失败的结果消息 /// </summary> public string SendFailEmails { get { return this._sendFailEmails; } set { this._sendFailEmails = value; OnPropertyChanged("SendFailEmails"); } } private int _currentSendNum; /// <summary> /// 当前正在发送的 第几个 /// </summary> public int CurrentSendNum { get { return this._currentSendNum; } set { this._currentSendNum = value; OnPropertyChanged("CurrentSendNum"); } } private bool _sendControlIsEnabled = true; /// <summary> /// 发送邮件 控件是否可用 /// </summary> public bool SendControlIsEnabled { get { return this._sendControlIsEnabled; } set { this._sendControlIsEnabled = value; OnPropertyChanged("SendControlIsEnabled"); } } private void OnPropertyChanged(string propertyName) { if (this.PropertyChanged != null) this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } }
界面上的使用
图001
通过上面的代码,可以看出SendResult类实现了INotifyPropertyChanged——此接口的用途是向客户端发出某一属性值已更改的通知,这个接口的定义很简单,如下:
namespace System.ComponentModel { // 摘要: // 向客户端发出某一属性值已更改的通知。 public interface INotifyPropertyChanged { // 摘要: // 在更改属性值时发生。 event PropertyChangedEventHandler PropertyChanged; } }
此接口中只有一个PropertyChanged事件的定义,顾名思义:此事件会在属性值发生改变时被触发调用,且不需要实现,我比较好奇其内部的具体实现。重点看图001中的红色和紫色区域,通过{Binding 属性名}的方式分别设置了进度条的当前值和发送按钮的可用状态,而{Binding 属性名}的用法在WPF中很普遍,其使用有点儿类似于WebForm中的数据绑定控件中的<%#Eval("属性名")>,既然是类似,那同样的还需要给控件设置一个类似DataSource的东东——使控件的数据绑定和具体的数据对象关联起来,才能实现相应的功能。
SendResult sendResult = new SendResult(); this.progressBar.DataContext = sendResult;
上面的代码就相当于是设置progressBar的数据源,只不过在WPF中它有另外一个名称叫:DataContext 数据上下文,几乎所有的WPF控件都有DataContext此属性,即都支持数据绑定。
到这里,进度条的实现已OK,效果图如下:
因为对WPF根本谈不上精通,如果有错解的地方,希望大家能指出或谈下自己的看法,感兴趣的朋友,可以留言相互交流学习!
相关文章推荐
- WPF邮件群发工具开发 之 进度条(属性改变通知机制)的实现
- 模拟实现WPF的依赖属性及绑定通知机制(3)--依赖对象
- 模拟实现WPF的依赖属性及绑定通知机制(4)--模拟实现绑定连动机制
- 模拟实现WPF的依赖属性及绑定通知机制(4)--模拟实现绑定连动机制
- 模拟实现WPF的依赖属性及绑定通知机制(1)--依赖属性 .
- Windows Store apps开发[54]数据绑定(3)通知属性改变
- 模拟实现WPF的依赖属性及绑定通知机制(2)--依赖对象的准备 .
- 模拟实现WPF的依赖属性及绑定通知机制(1)--依赖属性
- 模拟实现WPF的依赖属性及绑定通知机制(3)--依赖对象
- 模拟实现WPF的依赖属性及绑定通知机制(1)--依赖属性
- 模拟实现WPF的依赖属性及绑定通知机制(4)--模拟实现绑定连动机制 .
- 模拟实现WPF的依赖属性及绑定通知机制(2)--依赖对象的准备
- 模拟实现WPF的依赖属性及绑定通知机制(2)--依赖对象的准备
- 模拟实现WPF的依赖属性及绑定通知机制(3)--依赖对象
- iPhone开发之UIScrollView滚动组件的使用(二) 拖线实现按钮控制大图移动利用contentOffset属性
- 生产者和消费者问题【java等待通知机制实现】
- iOS开发-Runtime是如何实现weak属性的?
- iOS开发系列--通知与消息机制
- VB开发的上传实例,实现上传进度
- iOS开发系列--通知与消息机制----转