使用Terminal.Gui构建功能强大的.NET控制台应用
前言
前段时间分享了一个库帮你轻松的创建漂亮的.NET控制台应用程序 - Spectre.Console的文章教程,然后就有小伙伴提问:.NET控制台应用需要应对强交互性的场景,有什么好的解决方案?,今天大姚给大家分享一款适用于.NET的跨平台终端 UI 工具包,帮助大家快速构建功能强大的.NET控制台应用:Terminal.Gui。

项目介绍
Terminal.Gui是一个跨平台(Windows、Mac 和 Linux/Unix )、开源(遵循 MIT License)、免费的用于为.NET、.NET Core 和 Mono 构建丰富功能的控制台应用程序的工具包,并且该工具包适用于需要强交互性的场景。
项目特点
- 跨平台支持:可在Windows、Mac和Linux/Unix上运行。
- 键盘和鼠标输入:支持键盘和鼠标输入,包括拖放支持。
- 灵活布局:同时支持绝对布局和创新的计算布局系统 (Computed Layout)。Computed Layout 使控件之间的相对布局变得容易,并支持动态终端 UI。
- 剪贴板支持:通过 Clipboard 类提供文本的剪切、复制和粘贴功能。
- 任意视图:所有可见的 UI 元素都是 View 类的子类,这些子类可以包含任意数量的子视图。
- 高级应用特性:主循环支持处理事件、空闲处理程序、计时器和监控文件描述符。大多数类对于线程来说都是安全的。
- 响应式扩展 (Reactive Extensions):使用响应式扩展并受益于提高的代码可读性,以及应用 MVVM 模式和 ReactiveUI 数据绑定的能力。
快速上手
安装.NET Core SDK
上手体验之前,我们首先要安装好.NET运行、开发环境。

安装Terminal.Gui.Templates
dotnet new install Terminal.Gui.templates

创建一个新的Terminal.Gui 模板项目
dotnet new tui -n TestTerminalGui

编译并运行项目
cd TestTerminalGui
dotnet run


创建TerminalGuiExercise控制台应用
首先我们创建名为:TerminalGuiExercise的控制台应用。



安装Terminal.Gui包

消息框代码
static void Main(string[] args)
{
#region 消息框代码
Application.Init();
MessageBox.Query(100, 15,
"Question", "Do you like console apps?", "Yes", "No");
Application.Shutdown();
#endregion
}

简单的文本用户界面示例代码
创建一个简单的带菜单栏的文本用户界面示例代码:
static void Main(string[] args)
{
#region 创建一个简单的带菜单栏的文本用户界面示例代码
Application.Init();
var menu = new MenuBar(new MenuBarItem[] {
new MenuBarItem ("_File", new MenuItem [] {
new MenuItem ("_Quit", "", () => {
Application.RequestStop ();
})
}),});
var win = new Window("追逐时光者,你好!!!")
{
X = 0,
Y = 1,
Width = Dim.Fill(),
Height = Dim.Fill() - 1
};
Application.Top.Add(menu, win);
Application.Run();
Application.Shutdown();
#endregion
}

用户登录示例代码
using Terminal.Gui;
namespace TerminalGuiExercise
{
internal class Program
{
static void Main(string[] args)
{
//用户登录示例
Application.Run<UserLoginExampleWindow>();
}
}
public class UserLoginExampleWindow : Window
{
public TextField usernameText;
public UserLoginExampleWindow()
{
Title = "用户登录示例应用程序(Ctrl+Q退出)";
//创建输入组件和标签
var usernameLabel = new Label()
{
Text = "用户名:",
Y = 5
};
usernameText = new TextField("")
{
X = Pos.Right(usernameLabel),
Y = Pos.Bottom(usernameLabel) - 1,
Width = Dim.Fill(),
};
var passwordLabel = new Label()
{
Text = "密码:",
X = Pos.Left(usernameLabel),
Y = Pos.Bottom(usernameLabel) + 5
};
var passwordText = new TextField("")
{
Secret = true,
X = Pos.Left(usernameText),
Y = Pos.Top(passwordLabel),
Width = Dim.Fill(),
};
//创建登录按钮
var btnLogin = new Button()
{
Text = "登录",
Y = Pos.Bottom(passwordLabel) + 1,
X = Pos.Center(),
IsDefault = true,
};
//单击登录按钮时显示消息弹出
btnLogin.Clicked += () =>
{
if (usernameText.Text == "admin" && passwordText.Text == "123456")
{
MessageBox.Query("登录结果", "登录成功", "Ok");
Application.RequestStop();
}
else
{
MessageBox.ErrorQuery("登录结果", "用户名或密码不正确", "Ok");
}
};
//将视图添加到窗口
Add(usernameLabel, usernameText, passwordLabel, passwordText, btnLogin);
}
}
}



项目源码地址
更多项目实用功能和特性欢迎前往项目开源地址查看,别忘了给项目一个Star支持。
- GitHub开源地址:https://github.com/gui-cs/Terminal.Gui
- API Documentation:https://gui-cs.github.io/Terminal.Gui/api/Terminal.Gui
- 本文示例源码:https://github.com/YSGStudyHards/DotNetExercises/tree/master/TerminalGuiExercise
优秀项目和框架精选
该项目已收录到C#/.NET/.NET Core优秀项目和框架精选中,关注优秀项目和框架精选能让你及时了解C#、.NET和.NET Core领域的最新动态和最佳实践,提高开发工作效率和质量。坑已挖,欢迎大家踊跃提交PR推荐或自荐(让优秀的项目和框架不被埋没)。
https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.md
DotNetGuide技术社区交流群
- DotNetGuide技术社区是一个面向.NET开发者的开源技术社区,旨在为开发者们提供全面的C#/.NET/.NET Core相关学习资料、技术分享和咨询、项目框架推荐、求职和招聘资讯、以及解决问题的平台。
- 在DotNetGuide技术社区中,开发者们可以分享自己的技术文章、项目经验、学习心得、遇到的疑难技术问题以及解决方案,并且还有机会结识志同道合的开发者。
- 我们致力于构建一个积极向上、和谐友善的.NET技术交流平台。无论您是初学者还是有丰富经验的开发者,我们都希望能为您提供更多的价值和成长机会。
使用Terminal.Gui构建功能强大的.NET控制台应用的更多相关文章
- 简单使用Laravel-admin构建一个功能强大的后台管理
Laravel-admin可以快速构建一个功能强大的后台,方便快速开发. 以下内容记录简单使用Laravel-admin,以及遇到小错误的解决方法. Laravel-admin 依赖以下环境 需要提前 ...
- 功能强大而又简单易学的编程语言Python
Python是一种面向对象.直译式计算机程序设计语言,也是一种功能强大的通用型语言.首先,Python非常简单,以Hello World为例: Java的Hello World程序一般这么写: pub ...
- 插件介绍 :cropper是一款使用简单且功能强大的图片剪裁jQuery插件。
简要教程 cropper是一款使用简单且功能强大的图片剪裁jQuery插件.该图片剪裁插件支持图片放大缩小,支持鼠标滚轮操作,支持图片旋转,支持触摸屏设备,支持canvas,并且支持跨浏览器使用. c ...
- SuperSpider——打造功能强大的爬虫利器
SuperSpider——打造功能强大的爬虫利器 1.爬虫的介绍 图1-1 爬虫(spider) 网络爬虫(web spider)是一个自动的通过网络抓取互联网 上的网页的程序,在当今互联网 中 ...
- 痞子衡嵌入式:超级好用的可视化PyQt GUI构建工具(Qt Designer)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是PyQt GUI构建工具Qt Designer. 痞子衡开博客至今已有好几年,一直以嵌入式开发相关主题的文章为主线,偶尔穿插一些其他技术 ...
- 痞子衡嵌入式:极易上手的可视化wxPython GUI构建工具(wxFormBuilder)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是wxPython GUI构建工具wxFormBuilder. 一.手工代码布局GUI界面的烦恼 如果你曾经设计过上位机软件GUI界面,初 ...
- Fibratus:一款功能强大的Windows内核漏洞利用和跟踪工具
今天给大家介绍的是一款名叫Fibratus的开源工具,广大研究人员可以使用这款功能强大的工具来进行Windows内核漏洞利用.挖掘与跟踪. Fibratus这款工具能够捕捉到绝大多数的Windows内 ...
- 功能强大的文件上传插件带上传进度-WebUploader
WebUploader是由Baidu WebFE(FEX)团队开发的一个以HTML5/FLASH构建的现代文件上传组件.在现代的浏览器里面能充分发挥HTML5的优势,同时又不摒弃主流IE浏览器,沿用老 ...
- SAX,功能强大的 API
https://www.ibm.com/developerworks/cn/xml/x-saxapi/ SAX,功能强大的 API 在摘自 XML by Example 的本篇预览中比较了 DOM 和 ...
- OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言
OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(ExpressionLanguage,简称为EL),通过它简单一致的表达式语法,可以存取 ...
随机推荐
- 使用SQL Server语句统计某年龄段人数占总人数的比例(多层查询语句嵌套-比例分析)
需求:需统计出某个集合内,某个段所占的比例,涉及SELECT查询语句的嵌套,如有疑问可留言. 如下: --按性别进行年度挂号年龄段分析--男SELECT 年龄段,SUM(人数) 数量,cast(cas ...
- 基于FPGA的贪吃蛇游戏 之代码解析
基于FPGA的贪吃蛇游戏 之代码解析 1. 代码结构 代码结构包含7格.v文件. 下面依次解析. 2. 代码解析 (1) seg_display.v 数码管的译码模块是最熟悉,最简单的模块了.这里是共 ...
- NumPy 数组复制与视图详解
NumPy 数组的复制与视图 NumPy 数组的复制和视图是两种不同的方式来创建新数组,它们之间存在着重要的区别. 复制 复制 会创建一个包含原始数组相同元素的新数组,但这两个数组拥有独立的内存空间. ...
- Python函数与模块的精髓与高级特性
本文分享自华为云社区<Python函数与模块的精髓与高级特性>,作者:柠檬味拥抱. Python 是一种功能强大的编程语言,拥有丰富的函数和模块,使得开发者能够轻松地构建复杂的应用程序.本 ...
- Ubuntu 启用交换分区
前言 交换分区也称之为 swap 分区,允许系统在内存不足的情况下将内存程序写入文件,防止系统卡死失去响应的情况发生. 检查现有交换分区 首先,确认系统中是否已存在交换分区或文件.在终端中输入以下命令 ...
- AIRIOT物联网低代码平台如何配置db-driver驱动?
设备接入能力包括接入驱动类型及接入数据量,性能方面需要考量数据采集的稳定性和驱动的丰富性等多个因素.用户在选择物联网平台时,往往存在一些误区,比如很关注平台支持的驱动数量,越多越好.市场上确有支持上千 ...
- .net core的学习小结
课程:[.NET 6教程,.Net Core 2022视频教程,杨中科主讲] https://www.bilibili.com/video/BV1pK41137He/?p=159&share_ ...
- 微信小程序跳转重新加载目标页
可用于在首次进入到小程序后就执行性了首页的onLoad方法,等你再去点击其它页面再回来的时候就不会加载onLoad了,比如你跳到登录页后再返回到首页会发现首页啥数据都没加载,所以你在登录那边进行跳转的 ...
- pandas基础--基本功能
pandas含有是数据分析工作变得更快更简单的高级数据结构和操作工具,是基于numpy构建的. 本章节的代码引入pandas约定为:import pandas as pd,另外import numpy ...
- 数据结构之栈(Java,C语言的实现)以及相关习题巩固
目录 栈 概念以及代码实现 例题 232. 用栈实现队列 1614. 括号的最大嵌套深度 234. 回文链表 1614. 括号的最大嵌套深度 LCR 123. 图书整理 I 206. 反转链表 402 ...