C# ProgressBar的简单使用

ProgressBar控件(进度条)用于在win窗体中显示进度,由于它的值会不断更新,为了不让界面假死,一般都是采用多线程的方式对进度条进行管理。有关ProgressBar的理论基础跟详细知识我在这里不多说,官方文档上面都可以查阅参考。这篇随笔我就是简单演示一下对ProgressBar控件的简单使用。

先展示一下窗口界面:

左上角是两个ProgressBar,右上角按钮负责控制ProgressBar进度的开启。右下角的四个按钮看起来很熟悉是吧,因为这是在上一篇博文中所演示的Demo的基础上继续往后做的。

一、首先定义一个控制ProgressBar进度的委托方法,为什么要用委托呢?因为ProgressBar控件是由主线程创建的,而对ProgressBar的操作是放在一个子线程中的,这在后面的跨线程操作控件中需要用到委托方法。代码如下:

1 private delegate void DelSetPro(int pro, ProgressBar proBar);//设置进度条进度的委托方法

二、定义一个共通的方法,用于设置进度条的进度,代码如下:

 1 /// <summary>
 2 /// 设置ProgressBar的进度。
 3 /// </summary>
 4 /// <param name="pro"></param>
 5 /// <param name="proBar"></param>
 6 private void SetProgressMessage(int pro, ProgressBar proBar)
 7 {
 8     //如果当前调用方不是创建控件的一方,则需要使用this.Invoke()
 9     //在这里,ProgressBar控件是由主线程创建的,所以子线程要对该控件进行操作
10     //必须执行this.InvokeRequired进行判断。
11     if (this.InvokeRequired)
12     {
13         DelSetPro setPro = new DelSetPro(SetProgressMessage);
14         this.Invoke(setPro, new object[] { pro, proBar });
15     }
16     else
17     {
18         proBar.Value = Convert.ToInt32(pro);
19     }
20 }

设置ProgressBar进度

三、我希望ProgressBar的进度完成后,可以弹出一个确认窗口让我知道,并且确认后消失。这个跟设置ProgressBar的进度大同小异,只是具体的实现细节不一样。委托方法代码如下:

1 private delegate void DelSetProVisi(ProgressBar proBar);//设置进度条消失的委托方法

四、定义一个共通的方法,用于让进度条消失,代码如下:

 1 /// <summary>
 2 /// 让控件ProgressBar消失。
 3 /// </summary>
 4 /// <param name="pro"></param>
 5 private void SetProgressBarVisi(ProgressBar pro)
 6 {
 7     if (this.InvokeRequired)
 8     {
 9         DelSetProVisi setProVisi = new DelSetProVisi(SetProgressBarVisi);
10         this.Invoke(setProVisi, new object[] { pro });
11     }
12     else
13     {
14         pro.Visible = false;
15     }
16 }

让进度条消失

五、接下就是对第一个进度条的具体操作了,在这个方法里会用到上面已经定义好的两个方法。请注意:ProgressBar的Maximum的默认值为100,Minimum的默认值为0,起初没注意Maximum,导致了超值异常。代码如下:

 1 /// <summary>
 2 /// 操作ProgressBar01
 3 /// </summary>
 4 private void SleepForProgressBar01()
 5 {
 6     for (int i = 1; i <= 100; i++)
 7     {
 8         Thread.Sleep(100);
 9         SetProgressMessage(i, progressBar1);
10     }
11     DialogResult dr01 = MessageBox.Show("ProgressBar01 has been finished!");
12     if (dr01.Equals(DialogResult.OK))
13     {
14         SetProgressBarVisi(progressBar1);
15     }
16 }

操作ProgressBar01控件

六、对第二个ProgressBar02控件的具体操作跟上面差不多,只是具体的进度不一样。就不赘述了。下面就直接展示一下实现效果图:

七、上面的几个步骤我拆解得比较细一点,可能初看起来有点乱,还有具体的一些细节方面我暂时也没有考虑太多,目前只是单纯的简单上手,在代码的优化方面应该还可以做得更好一点。这个Demo比较简单的,下面我就贴上Form1.cs的所有代码,欢迎各位批评指正。代码如下:

  1 using System;
  2 using System.Threading;
  3 using System.Windows.Forms;
  4 using WinFormsAppGame.Properties;
  5
  6 namespace WinFormsAppGame
  7 {
  8     public partial class Form1 : Form
  9     {
 10         private delegate void DelSetPro(int pro, ProgressBar proBar);//设置进度条进度的委托方法
 11         private delegate void DelSetProVisi(ProgressBar proBar);//设置进度条消失的委托方法
 12
 13         /// <summary>
 14         /// 设置ProgressBar的进度。
 15         /// </summary>
 16         /// <param name="pro"></param>
 17         /// <param name="proBar"></param>
 18         private void SetProgressMessage(int pro, ProgressBar proBar)
 19         {
 20             //如果当前调用方不是创建控件的一方,则需要使用this.Invoke()
 21             //在这里,ProgressBar控件是由主线程创建的,所以子线程要对该控件进行操作
 22             //必须执行this.InvokeRequired进行判断。
 23             if (this.InvokeRequired)
 24             {
 25                 DelSetPro setPro = new DelSetPro(SetProgressMessage);
 26                 this.Invoke(setPro, new object[] { pro, proBar });
 27             }
 28             else
 29             {
 30                 proBar.Value = Convert.ToInt32(pro);
 31             }
 32         }
 33
 34         /// <summary>
 35         /// 让控件ProgressBar消失。
 36         /// </summary>
 37         /// <param name="pro"></param>
 38         private void SetProgressBarVisi(ProgressBar pro)
 39         {
 40             if (this.InvokeRequired)
 41             {
 42                 DelSetProVisi setProVisi = new DelSetProVisi(SetProgressBarVisi);
 43                 this.Invoke(setProVisi, new object[] { pro });
 44             }
 45             else
 46             {
 47                 pro.Visible = false;
 48             }
 49         }
 50
 51         /// <summary>
 52         /// 操作ProgressBar01
 53         /// </summary>
 54         private void SleepForProgressBar01()
 55         {
 56             for (int i = 1; i <= 100; i++)
 57             {
 58                 Thread.Sleep(10);
 59                 SetProgressMessage(i, progressBar1);
 60             }
 61             DialogResult dr01 = MessageBox.Show("ProgressBar01 has been finished!");
 62             if (dr01.Equals(DialogResult.OK))
 63             {
 64                 SetProgressBarVisi(progressBar1);
 65             }
 66         }
 67
 68         /// <summary>
 69         /// 操作ProgressBar02
 70         /// </summary>
 71         private void SleepForProgressBar02()
 72         {
 73             for (int j = 1; j <= 100; j++)
 74             {
 75                 Thread.Sleep(30);
 76                 SetProgressMessage(j, progressBar2);
 77             }
 78             DialogResult dr02 = MessageBox.Show("ProgressBar02 has been finished!");
 79             if (dr02.Equals(DialogResult.OK))
 80             {
 81                 SetProgressBarVisi(progressBar2);
 82             }
 83         }
 84
 85         /// <summary>
 86         /// 监听方向键的KeyDown事件
 87         /// </summary>
 88         /// <param name="sender"></param>
 89         /// <param name="e"></param>
 90         private void Form1_KeyDown(object sender, KeyEventArgs e)
 91         {
 92             switch (e.KeyCode)
 93             {
 94                 case Keys.Left:
 95                     buttonLeft.BackgroundImage = Resources.left;
 96                     break;
 97                 case Keys.Up:
 98                     buttonUP.BackgroundImage = Resources.up;
 99                     break;
100                 case Keys.Right:
101                     buttonRight.BackgroundImage = Resources.right;
102                     break;
103                 case Keys.Down:
104                     buttonDown.BackgroundImage = Resources.down;
105                     break;
106             }
107         }
108
109         /// <summary>
110         /// 监听方向键的KeyUp事件
111         /// </summary>
112         /// <param name="sender"></param>
113         /// <param name="e"></param>
114         private void Form1_KeyUp(object sender, KeyEventArgs e)
115         {
116             switch (e.KeyCode)
117             {
118                 case Keys.Left:
119                     buttonLeft.BackgroundImage = Resources.left_dark;
120                     break;
121                 case Keys.Up:
122                     buttonUP.BackgroundImage = Resources.up_dark;
123                     break;
124                 case Keys.Right:
125                     buttonRight.BackgroundImage = Resources.right_dark;
126                     break;
127                 case Keys.Down:
128                     buttonDown.BackgroundImage = Resources.down_dark;
129                     break;
130             }
131         }
132
133         /// <summary>
134         /// 重写ProcessDialogKey,来允许监听方向键
135         /// </summary>
136         /// <param name="keycode"></param>
137         /// <returns></returns>
138         protected override bool ProcessDialogKey(Keys keycode)
139         {
140             switch (keycode)
141             {
142                 case Keys.Left:
143                 case Keys.Up:
144                 case Keys.Right:
145                 case Keys.Down:
146                     return false;
147             }
148             return true;
149         }
150
151         public Form1()
152         {
153             InitializeComponent();
154             this.KeyPreview = true;//让界面能够捕捉到键盘事件
155             //this.Cursor.Dispose();//在主界面中禁用鼠标
156         }
157
158         private void button1_Click(object sender, EventArgs e)
159         {
160             Thread pro01Thread = new Thread(new ThreadStart(SleepForProgressBar01));
161             Thread pro02Thread = new Thread(new ThreadStart(SleepForProgressBar02));
162             pro01Thread.Start();
163             pro02Thread.Start();
164         }
165     }
166 }

Form1.cs

以上!

时间: 2024-09-29 19:00:08

C# ProgressBar的简单使用的相关文章

ProgressBar的简单使用

当我们的应用在进行耗时操作时,显示一个进度条呈现给用户,让用户知道当前进度是一个很好的体验,接下来我们就来简单了解下ProgressBar(本文主要针对初学者,大神可以绕开啦),先看效果图: 进度条ProgressBar共有几种样式,如圆形,长条形等等,本例中用的是长条形: style="@android:style/Widget.ProgressBar.Horizontal" 进度是由5-0,逆向显示的,也就是一个倒计时,方法主要是Thread+Handler,在线程中通过不断变化的

android学习ProgressBar的简单使用

android 提供的ProgressBar控件分为两种,一种是不带进度的进度条,一种是带进度的进度条,如果可以计算任务的完成量那么就用带进度条的,如果无法计算任务量,那么就使用不带进度的进度条.ProgressBar如果说只使用系统提供的,那就很简单,就只有那些属性方法,但是感觉比较难得就是ProgressBar的样式,一般做应用都不会直接使用系统提供的,而是在它的额基础上做进一步的美化. ProgressBar的关键属性 android:max 最大值 android:proress 第一进

Android 打造形形色色的进度条 实现可以如此简单

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/43371299 ,本文出自:[张鸿洋的博客] 1.概述 最近需要用进度条,秉着不重复造轮子的原则,上github上搜索了一番,看了几个觉得比较好看的ProgressBar,比如:daimajia的等.简单看了下代码,基本都是继承自View,彻彻底底的自定义了一个进度条.盯着那绚丽滚动条,忽然觉得,为什么要通过View去写一个滚动条,系统已经提供了ProgressBar以及属于它的

Android进度条控件ProgressBar使用

ProgressBar有四种样式,圆形的(大,中,小)和直条形的(水平) 对应的style为 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="verti

Android_自定义进度条

转载:http://blog.csdn.net/lmj623565791/article/details/43371299 ,本文出自:[张鸿洋的博客] 1.概述 最近需要用进度条,秉着不重复造轮子的原则,上github上搜索了一番,看了几个觉得比较好看的ProgressBar,比如:daimajia的等.简单看了下代码,基本都是继承自View,彻彻底底的自定义了一个进度条.盯着那绚丽滚动条,忽然觉得,为什么要通过View去写一个滚动条,系统已经提供了ProgressBar以及属于它的特性,我们

Android好奇宝宝_番外篇_看脸的世界_04

这一篇是记录一下本猿自定义View的一般思路,通过一个炒鸡简单的自定义ProgressBar讲解一些自定义View的基础知识.适合新手,高手勿喷,有好的指点和想法的欢迎评论. (1)确认需求 写一个自定义View,首先你要确定需求是什么.一般包括外观,事件处理,动画效果. 外观需求:ProgressBar的外观需求非常简单,就是两个矩形(当然也可以是其它形状,这里我们只实现基础的矩形)重叠显示.其中一个固定大小的当背景,一个可变宽度的来显示刻度. 事件处理:ProgressBar不是SeekBa

(六十六)Android打造形形色色的进度条 (转载自:http://blog.csdn.net/lmj623565791/article/details/43371299)

转载自:http://blog.csdn.net/lmj623565791/article/details/43371299 ,本文出自:[张鸿洋的博客] 1.概述 最近需要用进度条,秉着不重复造轮子的原则,上github上搜索了一番,看了几个觉得比较好看的ProgressBar,比如:daimajia的等.简单看了下代码,基本都是继承自View,彻彻底底的自定义了一个进度条.盯着那绚丽滚动条,忽然觉得,为什么要通过View去写一个滚动条,系统已经提供了ProgressBar以及属于它的特性,我

Android学习—超简单实现带进度ProgressBar滚动条

思路:想在ProgressBar上显示百分比进度,百度.google搜索一下,满屏都是那个TextProgressBar,我没引用那个,当时觉得应该可以更简单的实现,于是直接就在UI上面尝试,把ProgressBar放在RelativeLayout布局中,并在ProgressBar后面加个TextView,使这两个控件叠加就解决了,下面是xml,可以参考~ 效果图: XML: <?xml version="1.0" encoding="utf-8"?>

Android简单自定义圆形和水平ProgressBar

ProgressBar简介 继承于View类,直接子类有AbsSeekBar和ContentLoadingProgressBar,其中AbsSeekBar的子类有SeekBar和RatingBar,可见这二者也是基于ProgressBar实现的. 1.ProgressBar有两个进度,一个是Android:progress,另一个是android:secondaryProgress.后者主要是为缓存需要所涉及的,比如在看网络视频时候都会有一个缓存的进度条以及还要一个播放的进度,在这里缓存的进度就