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

    文章

    85

    浏览量

    10349
  • 应用程序
    +关注

    关注

    37

    文章

    3267

    浏览量

    57684
  • .NET
    +关注

    关注

    0

    文章

    47

    浏览量

    24282
  • GUI
    GUI
    +关注

    关注

    3

    文章

    659

    浏览量

    39658
收藏 人收藏

    评论

    相关推荐

    如何利用微型电动云控制方案实现精准拍摄控制

    微型电动云台电机控制方案卓联微科技在当今智能化与自动化不断发展的时代,对设备的精准控制和高效运行提出了更高的要求。我们很荣幸地向您推出一款创新型的微型电动云
    的头像 发表于 11-27 01:04 165次阅读
    如何利用微型电动云<b class='flag-5'>台</b><b class='flag-5'>控制</b><b class='flag-5'>方案</b>实现精准拍摄<b class='flag-5'>控制</b>?

    类似大疆高精度三轴云驱动方案的深度解析

    对无人机需求的不断增长,对云的稳定性和精度要求也日益提高。大疆凭借其卓越的技术实力,研发出了令人惊叹的高精度三轴云驱动方案,为用户带来了前所未有的拍摄体验。 二、三轴云的基本原理
    的头像 发表于 10-10 17:30 398次阅读

    深度解析艾毕胜全景直播云驱动板方案

    在当今数字化的时代,全景直播以其独特的视角和沉浸式的体验,迅速吸引了广大用户的目光。而在这背后,全景直播云驱动板方案起着至关重要的作用。接下来,就让我们一同深入探究这一神秘而又关键的技术。 一
    的头像 发表于 10-09 17:38 238次阅读

    控制台窗口主机是什么

    控制台窗口主机(conhost),通常指的是在Windows操作系统中用于承载和控制控制台窗口(即命令行界面或CMD窗口)的进程。以下是对控制台窗口主机的介绍: 一、定义与功能 定义
    的头像 发表于 10-08 18:12 1987次阅读

    火语言RPA如何建立控制台应用

    火语言通过软件自带的丰富的颗粒组件库,开发出满足各种需求的应用。火语言中的应用分为两种常见类型,界面应用以及控制台应用。 下面详细介绍下控制台应用的定义以及构建方法。 控制台应用 控制台
    的头像 发表于 08-15 09:24 394次阅读
    火语言RPA如何建立<b class='flag-5'>控制台</b>应用

    UART调试控制台在带有FX3S的定制PCB上无法正常工作怎么解决?

    我正试图为我们带有赛普拉斯 FX3S 的定制 PCB 设置调试控制台。 GPIO 引脚 48 和 49 连接到 UART USB 适配器,然后连接到 PC,通过 COM 端口
    发表于 07-23 06:12

    升级到SDK 2.0,esp8266只会向控制台打印致命的异常,为什么?

    我升级到SDK 2.0,我在user_init文件中添加了新的必需函数。代码仍然可以编译和上传,但在启动后,esp8266只会向控制台打印致命的异常。使用 SDK 1.5.4,一切正常。
    发表于 07-12 06:57

    UART传输在控制台中显示垃圾值是哪里的问题?

    控制台窗口上显示的不是"Hello World" ,而是垃圾字符。 我检查了流程,发现与示例代码相似,如波特率设置正确,缓冲区流程也正确。 错误还可能出现在哪里?
    发表于 07-02 08:24

    蓝牙音频接收模块在调音台中的应用方案

    蓝牙模块方案的应用使得调音控制台实现了无线控制,摆脱了传统有线连接的束缚。音乐制作人员或演出者只需通过搭载蓝牙模块技术的移动设备(如智能手机、平板电脑)与调音控制台连接,即可实现对音频
    的头像 发表于 06-26 15:26 669次阅读
    蓝牙音频接收模块在调音台中的应用<b class='flag-5'>方案</b>

    通过win10控制台编译时,为什么有时需要不断敲回车才能继续编译?如何解决?

    通过win10控制台编译项目,控制台会实时显示编译进度,但是有时候出现一个文件编译好之后,控制台不自动编译下一个文件,需要敲一次回车才能继续,如何解决?
    发表于 06-19 06:35

    请问ESP32C3如何重定向控制台串口?

    软件环境:esp-idf v4.4 硬件环境:esp32c3 问题描述:需要将控制台输出重定向到 UART1(RX: GPIO4,TX:GPIO5),UART0 用来做上下位机通信。 按照这个链接
    发表于 06-07 08:12

    ArkTS语言基础类库-解析

    统一资源定位符,可以提供找到该资源的路径。 提供常见的[字符串和二进制数据处理]的能力,以及[控制台打印]的相关能力。 字符串编解码功能。 基于Base64的字节编码和解码功能。 提供常见的有理数操作
    发表于 02-20 16:44

    Python 控制台CS V8.11.00 综合开发环境用户手册

    电子发烧友网站提供《Python 控制台CS V8.11.00 综合开发环境用户手册.pdf》资料免费下载
    发表于 01-29 12:00 0次下载
    Python <b class='flag-5'>控制台</b>CS V8.11.00 综合开发环境用户手册

    LED树木灯光亮化方案的设计与控制技术解析

    LED树木灯光亮化方案的设计与控制技术解析
    的头像 发表于 01-24 17:54 781次阅读
    LED树木灯光亮化<b class='flag-5'>方案</b>的设计与<b class='flag-5'>控制</b>技术<b class='flag-5'>解析</b>

    如何利用ChatGPT快速实现一个控制台进度条小工具?

    控制台程序执行一些耗时任务时,需要向用户显示当前任务执行的进度,以提供清晰的感知。比如一个下载程序,通过进度条便能告知用户当前的下载进度。
    的头像 发表于 01-18 13:41 921次阅读
    如何利用ChatGPT快速实现一个<b class='flag-5'>控制台</b>进度条小工具?