引言
- progressbar 是进度显示控件,核心作用是直观展示任务执行进度(如文件下载、数据处理、批量操作)。
- c# winform 中的 progressbar 是工具箱原生控件,简单易用,但是要做到平滑流畅控制,还有一些小技巧的,本文以最简单方式介绍给大家。
一、拖入控件
将工具栏中的progressbar,拖入到界面中。可以到界面中会出现新的控件,当然为了美观也可以拖到底部状态栏(statusstrip)中。

二、设置核心属性
添加控件后可以在属性中看到各种属性(如下图),表中列举的是最核心的属性项目。

| 属性 | 作用 |
|---|---|
| minimum | 最小值(默认 0) |
| maximum | 最大值(默认 100) |
| value | 当前进度值(必须在 min~max 之间) |
| style | 样式:blocks(块状)/continuous(连续)/marquee(跑马灯,未知进度) |
| enabled | 是否启用/禁用控件(true/false) |
| visible | 是否显示/隐藏控件(true/false) |
,blocks(块状)/continuous(连续)/marquee(跑马灯,未知进度)三种可选。
1、无法确认过程时长
- 如果我们的运行的过程的时间完全无法确认,不知道任务总时长,又或者是先摆上界面临时使用。那么可以先设置样式(style)为marquee,只要在开始和结束的时候分别控制visible即可。
//状态枚举
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、可以获取运行时长
- 启动时,我们可以知道运行时间哪怕是不确定的,我们可以传递过来,入下面的时间就是timer_finish.interval。我们起一个任务,本质上也是启动了一个新的线程。
- 启动后调用了函数dorealprogress()异步处理,不影响主线程。
- refreshinterval 是检查的间隔时间,当前每100ms刷新一次,如果总时长10秒,可以刷新1000次,1秒也能10次。当然也可以自行修改自定义。
- percent 是当前的运行时间百分比,progressbar.value是当前显示的百分比,也可以将百分比以文字显示出来。
/// </summary>
///开始和结束
/// </summary>
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;
}
}
/// <summary>
/// 按时间比例自动计算进度
/// </summary>
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);
}
}
总结
- 本文简单介绍了progressbar的基础功能和使用,并使用代码实现了平滑流畅的效果,非常实用。已知进度和时间用 value 控制,未知进度用 marquee 跑马灯;
- 注意winform 跨线程更新 ui 用到了task任务和ui执行this.invoke()委托,将任务必须放在后台线程,避免界面卡死,也同时简化了异步代码,可读性更高;
- 直接复制代码即可运行,适配绝大多数进度场景哦!
到此这篇关于基于c#实现平滑流畅的进度条progressbar的文章就介绍到这了,更多相关c#实现进度条progressbar内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论