前言

前段时间分享了一个库帮你轻松的创建漂亮的.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支持。

优秀项目和框架精选

该项目已收录到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技术交流平台。无论您是初学者还是有丰富经验的开发者,我们都希望能为您提供更多的价值和成长机会。

欢迎加入DotNetGuide技术社区微信交流群

使用Terminal.Gui构建功能强大的.NET控制台应用的更多相关文章

  1. 简单使用Laravel-admin构建一个功能强大的后台管理

    Laravel-admin可以快速构建一个功能强大的后台,方便快速开发. 以下内容记录简单使用Laravel-admin,以及遇到小错误的解决方法. Laravel-admin 依赖以下环境 需要提前 ...

  2. 功能强大而又简单易学的编程语言Python

    Python是一种面向对象.直译式计算机程序设计语言,也是一种功能强大的通用型语言.首先,Python非常简单,以Hello World为例: Java的Hello World程序一般这么写: pub ...

  3. 插件介绍 :cropper是一款使用简单且功能强大的图片剪裁jQuery插件。

    简要教程 cropper是一款使用简单且功能强大的图片剪裁jQuery插件.该图片剪裁插件支持图片放大缩小,支持鼠标滚轮操作,支持图片旋转,支持触摸屏设备,支持canvas,并且支持跨浏览器使用. c ...

  4. SuperSpider——打造功能强大的爬虫利器

    SuperSpider——打造功能强大的爬虫利器   1.爬虫的介绍 图1-1  爬虫(spider) 网络爬虫(web spider)是一个自动的通过网络抓取互联网 上的网页的程序,在当今互联网 中 ...

  5. 痞子衡嵌入式:超级好用的可视化PyQt GUI构建工具(Qt Designer)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是PyQt GUI构建工具Qt Designer. 痞子衡开博客至今已有好几年,一直以嵌入式开发相关主题的文章为主线,偶尔穿插一些其他技术 ...

  6. 痞子衡嵌入式:极易上手的可视化wxPython GUI构建工具(wxFormBuilder)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是wxPython GUI构建工具wxFormBuilder. 一.手工代码布局GUI界面的烦恼 如果你曾经设计过上位机软件GUI界面,初 ...

  7. Fibratus:一款功能强大的Windows内核漏洞利用和跟踪工具

    今天给大家介绍的是一款名叫Fibratus的开源工具,广大研究人员可以使用这款功能强大的工具来进行Windows内核漏洞利用.挖掘与跟踪. Fibratus这款工具能够捕捉到绝大多数的Windows内 ...

  8. 功能强大的文件上传插件带上传进度-WebUploader

    WebUploader是由Baidu WebFE(FEX)团队开发的一个以HTML5/FLASH构建的现代文件上传组件.在现代的浏览器里面能充分发挥HTML5的优势,同时又不摒弃主流IE浏览器,沿用老 ...

  9. SAX,功能强大的 API

    https://www.ibm.com/developerworks/cn/xml/x-saxapi/ SAX,功能强大的 API 在摘自 XML by Example 的本篇预览中比较了 DOM 和 ...

  10. OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言

    OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(ExpressionLanguage,简称为EL),通过它简单一致的表达式语法,可以存取 ...

随机推荐

  1. ajax递归发送请求

    简介 大家都知道浏览器在处理http网络请求的时候,不同的浏览器会有不一样的并发限制,下表是一些主流浏览器对 HTTP 1.1 和 HTTP 1.0 的最大并发连接数目: Browser HTTP/1 ...

  2. lca总结+树上差分

    lca lca简称最近公共祖先--简介在此,不过多赘述 这里主要写的是倍增算法,oi-wiki上用的是vector,由于本人不会,只会用链表,所以这里就放链表的代码了 例题 加一个数组按倍增数组的方式 ...

  3. 面向K-12学生的远程访问学校计算机实验室

    ​ 为了应对新冠肺炎大流行,许多学校被迫采用远程学习和混合时间制度.在家学习的学生必须使用自己的个人设备或学校提供的设备(例如 Chromebook )来完成课堂作业. 尽管许多解决方案可以帮助学生和 ...

  4. IPv6 — 网际协议第 6 版

    目录 文章目录 目录 IPv6 IPv6 的发展 IPv6 网络基本概念 IPv6 的特性 IPv4 与 IPv6 的比较 IPv6 IPv6(Internet Protocol version 6, ...

  5. 用pageOffice控件实现 office word文档在线编辑 表格中写数据的方法

    PageOffice对Word文档中Table的操作,包括给单元格赋值和动态添加行的效果. 1 应用场景 OA办公中,经常要在文档的指定位置表格,填充后端指定数据. 如word文档中,表格数据 如下表 ...

  6. redis三主三从集群快速搭建

    redis集群快速搭建 1 本文以redis6.2.6版本为例,快速搭建一套三主三从的redis集群,已经提前将脚本写好,只需要在节点上面进行执行即可安装 #!/bin/bash install_re ...

  7. linux下vim的使用以及高效率的技巧

    目录 一.关于vim编辑器 二.vim编辑器的模式 三.一般模式下的基础操作 四.V模式(列模式)的基础操作 五.命令模式下的基础操作 六.自定义vim环境 七.vim同时打开多个文件 八.比较两个文 ...

  8. Vue 3 组件基础与模板语法详解

    title: Vue 3 组件基础与模板语法详解 date: 2024/5/24 16:31:13 updated: 2024/5/24 16:31:13 categories: 前端开发 tags: ...

  9. CSS——position定位属性

    就像photoshop中的图层功能会把一整张图片分层一个个图层一样,网页布局中的每一个元素也可以看成是一个个类似图层的层模型.层布局模型就是把网页中的每一个元素看成是一层一层的,然后通过定位属性pos ...

  10. SwiftObject 杂记

    一.前言 看了一段时间的Swift,慢慢转变了一些对Swift的看法. Swift作为苹果新晋的开发语言.具有模板编程.函数编程.协议多继承.vTable静态绑定.值引用类型区分.Option类型等动 ...