0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

提升.NET控制台应用体验的方案解析

454398 来源:博客园 作者:Lamond Lu 2020-10-29 11:30 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

在.NET生态系统中,控制台程序的表现相对较差。通常来说,这种项目经常作为Demo演示使用。现在是时候让控制台应用程序得到其应有的尊重了。

终端技术的发展开启了增强用户体验的复兴。ITerm2,Hyper,Windows Terminal,所有这些工具都为单调的控制台体验增加了一些趣味。 虽然这些工具都允许用户定制自己体验,但是对于开发人员来说,他们还希望向控制台应用程序中添加一些编程风格。

在本篇博文中,我们将一起看一下如何使用一些出色的开源项目为我们的控制台程序增添趣味。这里说明的顺序并不表明项目的优劣,他们都是改善我们控制台程序体验的优秀方案。

Colorful.Console#

Colorful.Console是一个Nuget包,它可以增强我们对控制台输出文字样式的控制。我们可以使用System.Drawing.Color中定义的颜色来定义控制台程序的配色方案。

using System;
using System.Drawing;
using Console = Colorful.Console;
...
...
Console.WriteLine("console in pink", Color.Pink);
Console.WriteLine("console in default");

除此之外,Colorful.Console还允许我们使用FIGlet字体编写带颜色的ASCII码输出

FIGLet:http://www.figlet.org/

FigletFont font = FigletFont.Load("chunky.flf");
Figlet figlet = new Figlet(font);

Console.WriteLine(figlet.ToAscii("Belvedere"), ColorTranslator.FromHtml("#8AFFEF"));
Console.WriteLine(figlet.ToAscii("ice"), ColorTranslator.FromHtml("#FAD6FF"));
Console.WriteLine(figlet.ToAscii("cream."), ColorTranslator.FromHtml("#B8DBFF"));

这个输出的结果完全就是黑客的梦想。

我建议你访问一下colorful.console的官方站点,了解这个库能实现的所有效果,以便更好的改善控制台程序的体验。

Colorful.Console:http://colorfulconsole.com/

ConsoleTables#

ConsoleTables包是我(作者)自己编写的,这里有一点厚颜无耻.。 使用这个库,可以让开发人员很轻松的将一组对象以表格的形式展示在控制台中。

static void Main(String[] args)
{
    var table = new ConsoleTable("one", "two", "three");
    table.AddRow(1, 2, 3)
         .AddRow("this line should be longer", "yes it is", "oh");

    table.Write();
    Console.WriteLine();

    var rows = Enumerable.Repeat(new Something(), 10);

    ConsoleTable
        .From(rows)
        .Configure(o => o.NumberAlignment = Alignment.Right)
        .Write(Format.Alternative);

    Console.ReadKey();
}

以前,谁不希望能在控制台中输出一个表格呢?

FORMAT: Default:

-------------------------------------------------
 | one                        | two       | three |
 --------------------------------------------------
 | 1                          | 2         | 3     |
 --------------------------------------------------
 | this line should be longer | yes it is | oh    |
 --------------------------------------------------

 Count: 2

FORMAT: Alternative:

+----------------------------+-----------+-------+
| one                        | two       | three |
+----------------------------+-----------+-------+
| 1                          | 2         | 3     |
+----------------------------+-----------+-------+
| this line should be longer | yes it is | oh    |
+----------------------------+-----------+-------+

自从ConsoleTables发布以来,许多开发人员已经研发出自己的控制台表格库了。有一些甚至更好,你可以自行去查找一下。

ShellProgressBar#

和需要其他应用程序一样,控制台程序也可以执行长时任务。ShellProgressBar是一个非常棒的库,使用它,你可以在控制台输出一些非常惊艳的进度条。而且,ShellProgressBar是可以实现进度条的嵌套使用。例如,如下GIF动画中展示的效果。

ShellProgressBar使用起来相当的直接。

const int totalTicks = 10;
var options = new ProgressBarOptions
{
    ProgressCharacter = '─',
    ProgressBarOnBottom = true
};
using (var pbar = new ProgressBar(totalTicks, "Initial message", options))
{
    pbar.Tick(); //will advance pbar to 1 out of 10.
    //we can also advance and update the progressbar text
    pbar.Tick("Step 2 of 10"); 
}

谢谢你,Martijin Larrman, 这真的是一个非常好用的库。

GUI.CS#

GUI.CS是一个非常棒的控制台UI工具包。它提供了一个功能完善的工具箱,开发人员可以使用它构建早期控制台常见的一种用户界面。

这个UI工具箱提供了如下控件:

  • Buttons
  • Labels
  • Text Entry
  • Text View
  • User Inputs
  • Windows
  • Menus
  • ScrollBars

使用它,开发人员可以在控制台应用中实现一些令人难以置信的效果。这个库是由Miguel De Icaza编写的,是控制台技术的巅峰之作,下面让我们一起来看一个实例程序。

using Terminal.Gui;

class Demo {
    static void Main ()
    {
        Application.Init ();
        var top = Application.Top;

	// 创建顶级窗体
        var win = new Window ("MyApp") {
	    X = 0,
	    Y = 1, // 预留菜单行

	    // 使用Dim.Fill(), 它可以自动调整窗体大小,实现自适应,而无需手动敢于
	    Width = Dim.Fill (),
	    Height = Dim.Fill ()
	};
        top.Add (win);

	// 创建一个菜单
        var menu = new MenuBar (new MenuBarItem [] {
            new MenuBarItem ("_File", new MenuItem [] {
                new MenuItem ("_New", "Creates new file", NewFile),
                new MenuItem ("_Close", "", () => Close ()),
                new MenuItem ("_Quit", "", () => { if (Quit ()) top.Running = false; })
            }),
            new MenuBarItem ("_Edit", new MenuItem [] {
                new MenuItem ("_Copy", "", null),
                new MenuItem ("C_ut", "", null),
                new MenuItem ("_Paste", "", null)
            })
        });
        top.Add (menu);

	var login = new Label ("Login: ") { X = 3, Y = 2 };
	var password = new Label ("Password: ") {
	    	X = Pos.Left (login),
		Y = Pos.Top (login) + 1
        };
	var loginText = new TextField ("") {
                X = Pos.Right (password),
                Y = Pos.Top (login),
                Width = 40
        };
        var passText = new TextField ("") {
                Secret = true,
                X = Pos.Left (loginText),
                Y = Pos.Top (password),
                Width = Dim.Width (loginText)
        };
	
	// 添加一些其他控件
	win.Add (
	    // 这是我最喜欢的布局
  	    login, password, loginText, passText,

	    // 这里使用了绝对定位
            new CheckBox (3, 6, "Remember me"),
            new RadioGroup (3, 8, new [] { "_Personal", "_Company" }),
            new Button (3, 14, "Ok"),
            new Button (10, 14, "Cancel"),
            new Label (3, 18, "Press F9 or ESC plus 9 to activate the menubar"));

        Application.Run ();
    }
}

总结#

作为开发人员,我们可以沉迷于GUI, 这是理所当然的,它使我们更有生产力。但是控制台应用程序同样也很强大。下次当你编写控制台程序的时候,你可以考虑使用以上介绍的某些库,以便为你的控制台应用增添色彩。
编辑:hfy

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 控制台
    +关注

    关注

    0

    文章

    86

    浏览量

    10885
  • 应用程序
    +关注

    关注

    38

    文章

    3342

    浏览量

    59921
  • .NET
    +关注

    关注

    0

    文章

    48

    浏览量

    24282
  • GUI
    GUI
    +关注

    关注

    3

    文章

    693

    浏览量

    42843
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    IDE或控制台下载调试报错怎么解决?

    ; IDE或控制台下载调试时遇到如下报错解决办法: unable to open ftdi device with vid 0403, pid 6010, description '
    发表于 11-06 07:31

    FlashDB移植到rt-thread nano,运行时控制台无输出怎么解决?

    rt-thread标准版和HAL裸机版,移植非常成功,换成nano 3.15版,就出现控制台无输出,也无法输入,调试时进入死循环,如图所示 ,关闭hook也不行,请求指点。谢谢! 上传测试代码,用的是nano4.1.1 4.1.1 (test).7z
    发表于 10-11 09:34

    怎么读取到msh控制台输入的命令?

    如题,怎么读取到msh控制台输入的命令(我的意思是输入的内容全部重定向获取出来),请各位大佬赐教 这个代码会提示Failed to find console device! #include
    发表于 09-29 08:37

    启用了控制台后,空闲线程是不是永远不会进入?

    控制台里打印线程(list thread)时,发现已经退出的线程已经是CLOSE状态,但是都是僵尸线程。然后查看shell代码,看到控制台一直在跑,所以手动添加了延时(rt_thread_delay)进入,但调试看到空闲线程还是没能进入。是有什么相关宏定义需要改,还是要
    发表于 09-19 06:53

    刚创建的项目控制台为什么不能用?

    我用cubmaxIDE配置的板子串口可以输出,但我用rt去直接创建的项目,就是rt自身刚创建时的那个打印数据,控制台都没反应这个问题处在哪个吗,按回车键也没有反应,这个那个大神知道为什么吗?
    发表于 09-17 07:40

    finsh 控制台dma发送如何操作?

    今天因为在高优先级线程中频繁调用rt_kprintf导致低优先级运行阻塞,所以突发奇想想试试控制台能不能dma发送,在保证对应uart tx dma的驱动打开后,rt_device_open里
    发表于 09-11 07:48

    摄像机云与消费电机的理想驱动:MS3142集成方案解析

    在科技飞速发展的今天,摄像机云和消费电机在我们的生活中扮演着越来越重要的角色。从专业的影视拍摄到日常生活中的智能设备,它们的应用场景日益广泛。而一个优秀的驱动方案对于这些设备的性能表现至关重要。今天,我们就来深入解析一下MS3
    的头像 发表于 08-14 17:44 564次阅读
    摄像机云<b class='flag-5'>台</b>与消费电机的理想驱动:MS3142集成<b class='flag-5'>方案</b><b class='flag-5'>解析</b>

    用 树莓派4 打造专属流媒体控制台

    用树莓派体验DIY智能科技!如今市面上有各种各样的流媒体控制台,但购买现成的哪有自己从零开始制作的有趣呢?至少,这似乎是树莓派创客社区的精神所在,就像创客兼开发者Last-Shake-9874所展示
    的头像 发表于 05-11 08:33 424次阅读
    用 树莓派4 打造专属流媒体<b class='flag-5'>控制台</b>!

    UART控制台通信问题:命令出现拆分或缺失字母,怎么解决?

    我正在使用 Explorer Kit 并使用 John Hyde 书中的示例固件,特别是第 4 章示例 4。我已连接两根 USB 电缆,并且线程显示正确。 固件的调试控制台打印工作正常。 但是,当从
    发表于 05-09 07:19

    TWR-VF65GS10塔式模块上编译的U-Boot没有控制台输出是怎么回事?

    和 RS232-to-FTDI USB 适配器成功启动,控制台输出。但是,当我从源代码编译 U-Boot 时(例如,使用 GitHub 上的 v2025.01 分支)并将生成的 U-Boot 二进制文件
    发表于 04-03 06:03

    加载示例图像时,COM7的调试控制台hello_world不显示消息怎么解决?

    板是 mimxrt1180_evk。 我无法从板中找到 JP5。 使用示例映像进行测试时,调试控制台(通过 Windows11 电脑中的 J53、COM7 连接hello_world不显示任何消息。 但是 gdb 在源文件中显示了我的简单代码更改。 请尽快发现,谢谢!
    发表于 03-25 07:01

    深蕾半导体IP-KVM产品方案解析

    随着信息技术的蓬勃发展,远程访问与控制技术逐渐成为各行各业不可或缺的一部分。深蕾半导体, 凭借其在芯片设计领域的深厚积累,推出了创新的IP-KVM产品方案,旨在为用户提供高效、 安全的远程访问与控制解决
    的头像 发表于 03-19 17:50 816次阅读
    深蕾半导体IP-KVM产品<b class='flag-5'>方案</b><b class='flag-5'>解析</b>

    工厂老化测试解决方案:GCOM80-2NET-E如何赋能智能制造

    老化测试是产品质量把控的关键,但传统方式效率低、成本高。GCOM80-2NET-E通过智能协议解析、多设备兼容和数据轻量化,大幅提升测试效率,缩短周期,助力企业实现智能化升级与降本增效。行业洞察
    的头像 发表于 03-18 11:38 864次阅读
    工厂老化测试解决<b class='flag-5'>方案</b>:GCOM80-2<b class='flag-5'>NET</b>-E如何赋能智能制造

    解析AMR设计关键要素:照明方案、通信方案

    自主移动机器人设计涉及各种重要器件,例如电机控制、传感器、电源、照明和通信器件等。在之前的两篇文章AMR电机控制方案超强整理,解析AMR设计关键要素:传感器、可见光通信驱动器、电源
    的头像 发表于 01-14 11:10 1287次阅读

    dotConnect:基于ADO.NET架构的增强型数据连接解决方案

    dotConnect是一个基于ADO.NET架构的增强型数据连接解决方案,是一个采用了大量创新技术的开发框架。dotConnect是一款适用于主要数据库和流行云应用程序的高性能数据提供程序,为开发
    的头像 发表于 01-07 11:07 698次阅读
    dotConnect:基于ADO.<b class='flag-5'>NET</b>架构的增强型数据连接解决<b class='flag-5'>方案</b>