原文:Upgrade Your .NET Console App Experience

作者:Khalid Abuhakmeh

译文:Lamond Lu

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

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

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

Colorful.Console

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

  1. using System;
  2. using System.Drawing;
  3. using Console = Colorful.Console;
  4. ...
  5. ...
  6. Console.WriteLine("console in pink", Color.Pink);
  7. Console.WriteLine("console in default");

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

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

  1. FigletFont font = FigletFont.Load("chunky.flf");
  2. Figlet figlet = new Figlet(font);
  3. Console.WriteLine(figlet.ToAscii("Belvedere"), ColorTranslator.FromHtml("#8AFFEF"));
  4. Console.WriteLine(figlet.ToAscii("ice"), ColorTranslator.FromHtml("#FAD6FF"));
  5. Console.WriteLine(figlet.ToAscii("cream."), ColorTranslator.FromHtml("#B8DBFF"));

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

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

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

ConsoleTables

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

  1. static void Main(String[] args)
  2. {
  3. var table = new ConsoleTable("one", "two", "three");
  4. table.AddRow(1, 2, 3)
  5. .AddRow("this line should be longer", "yes it is", "oh");
  6. table.Write();
  7. Console.WriteLine();
  8. var rows = Enumerable.Repeat(new Something(), 10);
  9. ConsoleTable
  10. .From<Something>(rows)
  11. .Configure(o => o.NumberAlignment = Alignment.Right)
  12. .Write(Format.Alternative);
  13. Console.ReadKey();
  14. }

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

  1. FORMAT: Default:
  2. --------------------------------------------------
  3. | one | two | three |
  4. --------------------------------------------------
  5. | 1 | 2 | 3 |
  6. --------------------------------------------------
  7. | this line should be longer | yes it is | oh |
  8. --------------------------------------------------
  9. Count: 2
  10. FORMAT: Alternative:
  11. +----------------------------+-----------+-------+
  12. | one | two | three |
  13. +----------------------------+-----------+-------+
  14. | 1 | 2 | 3 |
  15. +----------------------------+-----------+-------+
  16. | this line should be longer | yes it is | oh |
  17. +----------------------------+-----------+-------+

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

ShellProgressBar

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

ShellProgressBar使用起来相当的直接。

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

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

GUI.CS

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

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

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

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

  1. using Terminal.Gui;
  2. class Demo {
  3. static void Main ()
  4. {
  5. Application.Init ();
  6. var top = Application.Top;
  7. // 创建顶级窗体
  8. var win = new Window ("MyApp") {
  9. X = 0,
  10. Y = 1, // 预留菜单行
  11. // 使用Dim.Fill(), 它可以自动调整窗体大小,实现自适应,而无需手动敢于
  12. Width = Dim.Fill (),
  13. Height = Dim.Fill ()
  14. };
  15. top.Add (win);
  16. // 创建一个菜单
  17. var menu = new MenuBar (new MenuBarItem [] {
  18. new MenuBarItem ("_File", new MenuItem [] {
  19. new MenuItem ("_New", "Creates new file", NewFile),
  20. new MenuItem ("_Close", "", () => Close ()),
  21. new MenuItem ("_Quit", "", () => { if (Quit ()) top.Running = false; })
  22. }),
  23. new MenuBarItem ("_Edit", new MenuItem [] {
  24. new MenuItem ("_Copy", "", null),
  25. new MenuItem ("C_ut", "", null),
  26. new MenuItem ("_Paste", "", null)
  27. })
  28. });
  29. top.Add (menu);
  30. var login = new Label ("Login: ") { X = 3, Y = 2 };
  31. var password = new Label ("Password: ") {
  32. X = Pos.Left (login),
  33. Y = Pos.Top (login) + 1
  34. };
  35. var loginText = new TextField ("") {
  36. X = Pos.Right (password),
  37. Y = Pos.Top (login),
  38. Width = 40
  39. };
  40. var passText = new TextField ("") {
  41. Secret = true,
  42. X = Pos.Left (loginText),
  43. Y = Pos.Top (password),
  44. Width = Dim.Width (loginText)
  45. };
  46. // 添加一些其他控件
  47. win.Add (
  48. // 这是我最喜欢的布局
  49. login, password, loginText, passText,
  50. // 这里使用了绝对定位
  51. new CheckBox (3, 6, "Remember me"),
  52. new RadioGroup (3, 8, new [] { "_Personal", "_Company" }),
  53. new Button (3, 14, "Ok"),
  54. new Button (10, 14, "Cancel"),
  55. new Label (3, 18, "Press F9 or ESC plus 9 to activate the menubar"));
  56. Application.Run ();
  57. }
  58. }

总结

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

如何提升.NET控制台应用体验?的更多相关文章

  1. jQuery 浮动标签插件,帮助你提升表单用户体验

    浮动标签模式(Float Label Pattern)是最新流行的一种表单输入域的内容提示方式,当用户在输入框输入内容的时候,原先占位符的内容向上移动,显示在输入的内容的上面.这里推荐的这款 jQue ...

  2. 使用新一代js模板引擎NornJ提升React.js开发体验

    当前的前端世界中有很多著名的开源javascript模板引擎如Handlebars.Nunjucks.EJS等等,相信很多人对它们都并不陌生. js模板引擎的现状 通常来讲,这些js模板引擎项目都有一 ...

  3. 提升html5的性能体验系列之三流畅下拉刷新

    下拉刷新 为实现下拉刷新功能,大多H5框架都是通过DIV模拟下拉回弹动画,在低端android手机(Android4.4以下)上,DIV动画经常出现卡顿现象(特别是图文列表的情况).解决方案还是web ...

  4. 提升html5的性能体验系列之一避免切页白屏

    窗体切换白屏的现实问题 HTML5的性能比原生差很多,比如切页时白屏.列表滚动不流畅.下拉刷新和上拉翻页卡顿.在低端Android手机上,很多原生App常用的功能和体验效果都很难使用HTML5技术模拟 ...

  5. 提升HTML5的性能体验系列之三 流畅下拉刷新和上拉

    下拉刷新 为实现下拉刷新功能,大多H5框架都是通过DIV模拟下拉回弹动画,在低端android手机(Android4.4以下)上,DIV动画经常出现卡顿现象(特别是图文列表的情况).解决方案还是web ...

  6. 提升HTML5的性能体验系列之一 避免切页白屏

    窗体切换白屏的现实问题 HTML5的性能比原生差很多,比如切页时白屏.列表滚动不流畅.下拉刷新和上拉翻页卡顿.在低端Android手机上,很多原生App常用的功能和体验效果都很难使用HTML5技术模拟 ...

  7. 平衡图片负载,提升web站点访问体验

    最近给分公司做官方网站,内网测试一切ok,发布至云端后,体验惊人——公司外网网速渣渣(十几k~几十k),更加要命的是,网站的高清图,根本就加载不出来,几秒,十几秒过去了,仍然在转圈圈,如下图... 于 ...

  8. 使用 HTML5 input 类型提升移动端输入体验

    在过去的几年里,在移动设备上浏览网页已变得难以置信的受欢迎. 但是这些设备上的浏览体验,有时遗留很多的有待改进.当涉及到填写表单时,这一点尤为明显.幸运的是,HTML5规范引入了许多新input类型, ...

  9. 使用 HTML5 input 类型提升移动端输入体验(键盘)

    在最近的项目中,策划老是要求我们弹出各种类型的键盘,特别是在iOS下,例如输入帐号的时候,不应该支持输入中文,该输入纯数字的时候就应该谈数字键盘等.个人觉得这些都是我们平时开发很少意识到的,虽然有些刁 ...

随机推荐

  1. linux重定向与管道符(一)

    linux重定向和管道符 为什么要使用重定向 1.当屏幕输出的信息很重要,而且我们需要将他存下来的时候: 2.后台执行中的程序,不希望他干扰屏幕正常的输出结果时: 3.系统的例行命令,例如定时任务的执 ...

  2. 谈谈有关 Python 的GIL 和 互斥锁

    转载:https://blog.csdn.net/Amberdreams/article/details/81274217 有 Python 开发经验的人也许听说过这样一句话:Python 不能充分利 ...

  3. 常见的Java不规范代码

    1.格式化源代码 Ctrl + Shift + F – 格式化源代码. Ctrl + Shift + O – 管理import语句并移除未使用的语句 除了手动执行这两个功能外,你还可以让Eclipse ...

  4. K3CLOUD表关联

    销售订单关联发货通知单 销售订单表 T_SAL_ORDER A T_SAL_ORDERENTRY B T_SAL_ORDERENTRY_LK C 发货通知单表 T_SAL_DELIVERYNOTICE ...

  5. The 2019 Asia Nanchang First Round Online Programming Contest C(cf原题,线段树维护矩阵)

    题:https://nanti.jisuanke.com/t/41350 分析:先将字符串转置过来 状态转移,因为只有5个状态,所以 i 状态到 j 状态的最小代价就枚举[i][k]->[k][ ...

  6. 学习python-20191230(1)-Python Flask高级编程开发鱼书_第04章_应用、蓝图与视图函数

    视频06: 1.自动导包快捷键——默认为alt + enter 键组合          选中的字符由小写变为大写——Ctrl + Shift + U键组合 2.DataRequired()——防止用 ...

  7. 二、RabbitMQ简介及AMQP协议

    RabbitMQ简介 RabbitMQ是开源的消息代理和队列服务器,是由Erlang语言开发的,基于AMQP协议(Advanced Message Queuing Protocol高级消息队列协议)的 ...

  8. Linux下rabitMq的部署(源码安装)

    简版yum安装:https://www.jianshu.com/p/46c22834aad5 一.环境安装 1,安装预环境 通过yum安装以下组件,运行命令: [root@rabbitmqserver ...

  9. Java IO: InputStreamReader和OutputStreamWriter

    作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) 本章节将简要介绍InputStreamReader和OutputStreamWriter.细心的读者可 ...

  10. 吴裕雄--天生自然python学习笔记:Python3 多线程

    多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理. 用户界面可以更加吸引人,比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条 ...