第一步:首先我们创建一个winfor的项目
第二步:我们建一个窗体
在一个窗体里面 打开一个另外的窗体 另外的窗体有一个按钮 点击后就开始下载 下载完成后 在注册窗体上面 显示下载完成(达到在一个窗体里面修改另外的一个窗体)
class="brush:csharp;gutter:false;"> private void button1_Click(object sender, EventArgs e) { FormLoad fl = new FormLoad(); fl.Show(); }
第三步:完成下载窗体的进度条
private void button1_Click(object sender, EventArgs e) { for (int i = 0; i <= 100; i++) { this.progressBar1.Value = i; System.Threading.Thread.Sleep(300); } }
第四步:处理窗体假死问题
(用到多线程和委托)
public partial class FormLoad : Form { public FormLoad() { InitializeComponent(); //为这个委托变量赋值 changeProgerss = FunChangeProgress; } public void FunChangeProgress(int value) { this.progressBar1.Value = value; } private void button1_Click(object sender, EventArgs e) { //创建一个线程 System.Threading.Thread thr = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(Download)); thr.Start(100); } //线程方法 一定要是obje 类型参数 同时返回值是void private void Download(object obj) { for (int i = 0; i <= 100; i++) { //执行委托 changeProgerss(i); System.Threading.Thread.Sleep(300); } } //在下载窗体上面 建一个委托 public delegate void ChangeProgress(int value); //创建上面的委托的变量 public ChangeProgress changeProgerss; }
第五步:处理跨线程调用ui
线程间操作无效: 从不是创建控件“progressBar1”的线程访问它。
for (int i = 0; i <= 100; i++) { //执行委托 this.progressBar1.Invoke(changeProgerss, i); //changeProgerss(i); System.Threading.Thread.Sleep(300); }
第六步 主窗体添加委托 解决跨线程调用UI
public FormMain() { InitializeComponent(); sif = ShowInfoFun; } public void ShowInfoFun(string text) { this.label1.Text = text; } private void button1_Click(object sender, EventArgs e) { FormLoad fl = new FormLoad(); //在主窗体中注册子窗体的事件 fl.eventShowInfo += new FormLoad.ShowInfo(fl_eventShowInfo); fl.Show(); } //事件的执行方法 void fl_eventShowInfo(string text) { this.label1.Invoke(sif, text); } //在主窗体这里 创建一个委托 public delegate void ShowInfo(string text); public ShowInfo sif; }
视频下载地址:http://pan.baidu.com/share/link?shareid=1740683788&uk=540184145
需要源码的可以到这里向楼主要:http://www.bamn.cn/redirect.php?tid=19&goto=lastpost#lastpost