如何在C#控制台程序中漂亮的显示进度条

ShellProgressBar库的使用

控制台程序有时也需要进度条来显示任务执行的详细进度,最近就发现了一个第三方的类库叫ShellProgressBar,这个类库可以在控制台程序中完美的显示进度条。ShellProgressBar是一个非常棒的库,使用它,你可以在控制台输出一些非常惊艳的进度条。而且,ShellProgressBar是可以实现进度条的嵌套使用。而且也已经开始支持.net core。

1.visualize (concurrent) progress in your console application
2.This is a great little library to visualize long running command line tasks.
3.NET Core ready!
4.It also supports spawning child progress bars which allows you to visualize dependencies and concurrency rather nicely.

1. ShellProgressBar库安装

也是用NuGet来安装 : http://www.nuget.org/packages/ShellProgressBar/
使用时引用:using ShellProgressBar;的命名空间

2. ShellProgressBar的使用

我们先来建一个模拟调用进度的方法,来执行进度。

// 请求退出执行
public static bool RequestToQuit { get; set; }
// 标记完成方法
public static void TickToCompletion(IProgressBar pbar, int ticks, int sleep = 1750, Action<int> childAction = null)
{
	var initialMessage = pbar.Message;
	for (var i = 0; i < ticks && !RequestToQuit; i++)
	{
		pbar.Message = $"Start {i + 1} of {ticks} {Console.CursorTop}/{Console.WindowHeight}: {initialMessage}";
		childAction?.Invoke(i);
		Thread.Sleep(sleep);
		pbar.Tick($"End {i + 1} of {ticks} {Console.CursorTop}/{Console.WindowHeight}: {initialMessage}");
	}
}

然后配置进度条配置参数,执行走进度。

const int totalTicks = 10;
var options = new ProgressBarOptions
{
	ProgressCharacter = '─',
	ProgressBarOnBottom = true
};
using (var pbar = new ProgressBar(totalTicks, "progress bar is on the bottom now", options))
{
	TickToCompletion(pbar, totalTicks, sleep: 500);
}
  • 执行效果截图

ShellProgressBar的使用

3. 配置进度条的样式

除了常规的进度条,还可以配置进度条的样式。

const int totalTicks = 10;
var options = new ProgressBarOptions
{
	// 设置前景色
	ForegroundColor = ConsoleColor.Yellow,
	// 设置完成时的前景色
	ForegroundColorDone = ConsoleColor.DarkGreen,
	// 设置背景色
	BackgroundColor = ConsoleColor.DarkGray,
	// 设置背景字符
	BackgroundCharacter = '\u2593'
};
using (var pbar = new ProgressBar(totalTicks, "showing off styling", options))
{
	TickToCompletion(pbar, totalTicks, sleep: 500);
}
  • 执行效果截图

配置进度条的样式

4. 设置非实时刷新进度

默认进度条的刷新时间是500ms,我们可以设置不让它实时刷新。

const int totalTicks = 5;
var options = new ProgressBarOptions
{
	// 关闭实时显示时间
	DisplayTimeInRealTime = false
};
using (var pbar = new ProgressBar(totalTicks, "only draw progress on tick", options))
{
	TickToCompletion(pbar, totalTicks, sleep: 1750);
}
  • 执行效果截图

设置非实时刷新进度

5. 嵌套子进度条

我们还可以嵌套子进度条,进度条下都可以嵌套属于自己的子进度条。

const int totalTicks = 10;
// 主进度条配置
var options = new ProgressBarOptions
{
	ForegroundColor = ConsoleColor.Yellow,
	BackgroundColor = ConsoleColor.DarkYellow,
	ProgressCharacter = '─'
};
// 子进度条配置
var childOptions = new ProgressBarOptions
{
	ForegroundColor = ConsoleColor.Green,
	BackgroundColor = ConsoleColor.DarkGreen,
	ProgressCharacter = '─',
	// 当完成时保存子进度条状态
	CollapseWhenFinished = false
};
// 执行嵌套进度
using (var pbar = new ProgressBar(totalTicks, "main progressbar", options))
{
	TickToCompletion(pbar, totalTicks, sleep: 10, childAction: (x) =>
	{
		using (var child = pbar.Spawn(totalTicks, "child actions", childOptions))
		{
			TickToCompletion(child, totalTicks, sleep: 100);
		}
	});
}
  • 执行效果截图

嵌套子进度条

6. 项目地址链接

shellprogressbar https://github.com/Mpdreamz/shellprogressbar

如果想要在进度条末端显示百分比,可以通过自定义 ProgressBar 的绘制方式来实现。具体做法如下: 1. 在窗体上添加一个 ProgressBar 控件和一个 Label 控件,设置 ProgressBar 的 Style 属性为 ProgressBarStyle.Continuous,Label 控件用于显示进度百分比。 2. 在窗体的 Load 事件添加以下代码: ```csharp private void Form1_Load(object sender, EventArgs e) { // 设置 ProgressBar 的最大值和初始值 progressBar1.Maximum = 100; progressBar1.Value = 0; // 设置 ProgressBar 的 Style 为 Continuous progressBar1.Style = ProgressBarStyle.Continuous; } ``` 3. 重写 ProgressBar 的 Paint 方法,绘制进度条末端的百分比。代码如下: ```csharp private void progressBar1_Paint(object sender, PaintEventArgs e) { // 获取 ProgressBar 上下文 var g = e.Graphics; // 获取 ProgressBar 客户区域 var rect = progressBar1.ClientRectangle; // 计算进度条的宽度 var progressBarWidth = (int)(rect.Width * ((double)progressBar1.Value / progressBar1.Maximum)); // 绘制进度条 var progressBarRect = new Rectangle(rect.X, rect.Y, progressBarWidth, rect.Height); g.FillRectangle(Brushes.Green, progressBarRect); // 绘制进度百分比 var percent = (int)(((double)progressBar1.Value / progressBar1.Maximum) * 100); var percentText = $"{percent}%"; var textSize = g.MeasureString(percentText, progressBar1.Font); var textX = rect.X + progressBarWidth - (int)textSize.Width; var textY = rect.Y + (rect.Height - (int)textSize.Height) / 2; var textPoint = new PointF(textX, textY); g.DrawString(percentText, progressBar1.Font, Brushes.White, textPoint); } ``` 在上面的代码,我们首先获取 ProgressBar 的客户区域和当前进度条的宽度,然后绘制进度条。接着计算进度百分比并绘制在进度条末端。最后在窗体的 Load 事件将 Paint 事件和 ProgressBar 控件关联即可。 这样就可以实现在进度条末端显示百分比的效果了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值