在.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文章
88瀏覽量
10992 -
應用程序
+關注
關注
38文章
3344瀏覽量
60259 -
.NET
+關注
關注
0文章
48瀏覽量
24282 -
GUI
+關注
關注
3文章
697瀏覽量
43473
發布評論請先 登錄
華為面向Net5.5G產品方案推動產業加速邁向智能時代
IDE或控制臺下載調試報錯怎么解決?
FlashDB移植到rt-thread nano,運行時控制臺無輸出怎么解決?
怎么讀取到msh控制臺輸入的命令?
啟用了控制臺后,空閑線程是不是永遠不會進入?
剛創建的項目控制臺為什么不能用?
finsh 控制臺dma發送如何操作?
攝像機云臺與消費電機的理想驅動:MS3142集成方案解析
HarmonyOS5云服務技術分享--應用預加載提速指南
用 樹莓派4 打造專屬流媒體控制臺!
UART控制臺通信問題:命令出現拆分或缺失字母,怎么解決?
TWR-VF65GS10塔式模塊上編譯的U-Boot沒有控制臺輸出是怎么回事?
加載示例圖像時,COM7的調試控制臺hello_world不顯示消息怎么解決?
工廠老化測試解決方案:GCOM80-2NET-E如何賦能智能制造
提升.NET控制臺應用體驗的方案解析
評論