C#实现平滑流畅ProgressBar进度条的方法
时间:2026-08-18 | 作者:穿越地图的猫 | 阅读:0引言
进度条在开发中很常见。文件下载、数据处理、批量操作这类需要等待的场景,都需要它来告诉用户“任务还在进行中”。
WinForm自带的ProgressBar控件,拖进窗体后就能直接使用。但如果想让它显示得更顺滑、界面看起来不卡顿,还需要注意一些实现细节。
这篇文章就围绕这些细节展开说明。
一、拖入控件
从工具箱中将ProgressBar拖到窗体上即可使用。
如果想让界面显得更专业,也可以把它拖到状态栏statusStrip中,和状态文字放在一起,视觉上会更紧凑。
二、设置核心属性
控件放好后,可以在属性面板中看到很多配置项。
其中最关键的是下面几个属性。它们会直接决定进度条的显示方式和运行表现。
| 属性 | 作用 |
|---|---|
| Minimum | 最小值(默认 0) |
| Maximum | 最大值(默认 100) |
| Value | 当前进度值(必须在 Min~Max 之间) |
| Style | 样式:Blocks(块状)/Continuous(连续)/Marquee(跑马灯,未知进度) |
| Enabled | 是否启用/禁用控件(True/False) |
| Visible | 是否显示/隐藏控件(True/False) |
三、选择样式和构建代码
Style属性是进度条的核心。它决定了进度条以什么方式展示。
常见的三种模式分别是:Blocks、Continuous、Marquee。
选择哪一种,关键取决于你是否能掌握任务时长。
1、无法确认过程时长
如果任务总时长无法确认,或者只是先做界面占位,那么直接使用Marquee模式最省心。
这种模式下,进度条会持续循环滚动,直到手动隐藏。控制逻辑也很简单:开始任务时显示,结束任务时隐藏。
//状态枚举
public enum DEV_RUN_STATUS
{
Null,
Idle,
Starting,
Running,
Stoping,
}
RUNNING_STEP startRunningStep = RUNNING_STEP.Ready;//开始运行步骤变量,Ready
//初始化加载
private void Form_main_Load(object sender, EventArgs e)
{
progressBar.Style = ProgressBarStyle.Marquee;//指定样式
progressBar.MarqueeAnimationSpeed = 30; // 指定动画速度
}
private void btnControlStart_Click(object sender, EventArgs e)
{
if (startRunningStep == RUNNING_STEP.Ready)
{
//运行开始显示进度条
ProgressBar.Visbile = true;
}
else if (startRunningStep == RUNNING_STEP.Stoping)
{
//运行结束隐藏进度条
ProgressBar.Visbile = false;
}
}
2、可以获取运行时长
如果能够估算任务总时长,即使不是特别精确,也可以使用百分比进度条。
下面这段代码把总时长作为参数传入。后台异步计算进度,每100毫秒刷新一次,因此显示效果会比较平滑。
- 启动时,把
timer_Finish.Interval(总时长,单位毫秒)传进去。 - 后台线程通过
Task.Run启动,不阻塞UI。 - 刷新间隔
refreshInterval默认100ms。总时长10秒时可刷新100次,1秒也能刷新10次,基本足够。 - 进度百分比直接用
ProgressBar.Value显示,也可以同步在状态栏中显示文字。
///
///开始和结束
///
private void btnControlStart_Click(object sender, EventArgs e)
{
if (startRunningStep == RUNNING_STEP.Ready)
{
//运行开始显示进度条
ProgressBar.Visbile = true;
//启用百分比文字显示
toolStripStatusLabel_percentage.Visible = true;
// 启动后台进度条任务,时间作为输入参数
Task.Run(() => DoRealProgress(timer_Finish.Interval));
}
else if (startRunningStep == RUNNING_STEP.Stoping)
{
//运行结束隐藏进度条
ProgressBar.Visbile = false;
//关闭百分比显示
toolStripStatusLabel_percentage.Visible = false;
}
}
///
/// 按时间比例自动计算进度
///
private async void DoRealProgress(int totalMs)
{
//读取开始时间作为分母
DateTime startTime = DateTime.Now;
// 每100ms刷新一次,比较平滑流畅
int refreshInterval = 100;
while (isStartRunning)
{
// 计算已用时间
double elapsedMs = (DateTime.Now - startTime).TotalMilliseconds;
// 计算百分比(0~100)读取当前时间除以开始时间获取百分比
int percent = (int)(elapsedMs / totalMs * 100);
// 防止超过100
percent = Math.Min(percent, 100);
// 委托更新UI
this.Invoke(new Action(() => {
//设置百分比
ProgressBar.Value = percent;
//文本显示百分比
toolStripStatusLabel_percentage.Text = $"{percent}%";
}));
//延时
await Task.Delay(refreshInterval);
}
}
总结
- 已知进度和时间,用
Value控制。 - 未知进度,用
Marquee跑马灯。 - 跨线程更新UI时,使用
Task配合this.Invoke()委托。后台线程负责计算,UI线程负责显示,界面不会卡死。 - 这套写法可以直接复用,能够覆盖大多数进度展示场景。
免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。
相关文章
更多-
- 打破多年惯例!小米18缺席9月发布会 卢伟冰:不会让大家等太久
- 时间:2026-08-25
-
- C# 里字段(Field)和属性(Property)到底怎么区分?一篇讲清职责、写法与选型
- 时间:2026-08-24
-
- 突破500万分、十核全大核设计!小米晒玄戒O3性能:领先苹果A19 Pro
- 时间:2026-08-24
-
- 红米Note12 Pro扩容内存必须获取root权限吗
- 时间:2026-08-24
-
- 华硕天选7 Pro与Max游戏本发布 售价10399元起
- 时间:2026-08-23
-
- 红米K20 Pro微信悬浮窗开启方法与使用教程
- 时间:2026-08-23
-
- 红米Note12 Pro与Note12续航对比实测
- 时间:2026-08-23
-
- 红米Note12T Pro电池容量与详细配置参数介绍
- 时间:2026-08-23
精选合集
更多大家都在玩
大家都在看
更多-
- 为什么湿头发更容易断裂 蚂蚁庄园今日答案9.15
- 时间:2026-09-14
-
- 蚂蚁庄园今天答题答案2026年9月15日
- 时间:2026-09-14
-
- 蚂蚁庄园答题今日答案2026年9月15日
- 时间:2026-09-14
-
- 蚂蚁庄园小课堂2026年9月15日最新题目答案
- 时间:2026-09-14
-
- 小鸡答题今天的答案是什么2026年9月15日
- 时间:2026-09-14
-
- 蚂蚁庄园每日答题答案2026年9月15日
- 时间:2026-09-14
-
- 糖尿病患者禁食所有含糖食物吗 蚂蚁庄园今日答案9月15日
- 时间:2026-09-14
-
- 2026年9月14日蚂蚁新村答案
- 时间:2026-09-14

