使用Terminal.Gui构建功能强大的.NET控制台应用

terminal,gui,net · 浏览次数 : 48

小编点评

前言 前段时间分享了一个库帮你轻松的创建漂亮的.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运行、开发环境。下载地址:https://dotnet.microsoft.com/zh-cn/download 安装Terminal.Gui.Templates dotnet new install Terminal.Gui.templates 创建一个新的Terminal.Gui 模板项目 dotnet new tui -n TestTerminalGui 编译并运行项目 cd TestTerminalGuidotnet run 创建Terminal Gui Exercise控制台应用 首先我们创建名为: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 // 用户登录示例 Application.Run(); } 简单的文本用户界面示例代码 创建一个简单的带菜单栏的文本用户界面示例代码: ```csharp static void Main(string[] args) { #region 创建一个简单的带菜单栏的文本用户界面示例代码 Application.Init(); var menu = new MenuBar(new MenuBarItem[] { new MenuBarItem("_File", new MenuItem[] { new MenuItem("_Quit", null, () => { Application.RequestStop(); }) }), }); var win = new Window("追逐时光者,你好!!!"); win.X = 0; win.Y = 1; win.Width = Dim.Fill(); win.Height = Dim.Fill() - 1; Application.Top.Add(menu, win); Application.Run(); Application.Shutdown(); #endregion } ``` 用户登录示例代码 ```csharp using Terminal.Gui; namespace TerminalGuiExercise { internal class Program { static void Main(string[] args) { // 用户登录示例 Application.Run(); } } public class UserLoginExampleWindow : Window { public TextField usernameText; public UserLoginExampleWindow() { Title = "用户登录示例应用程序(Ctrl+Q退出)"; // 创建输入组件和标签 var usernameLabel = new Label() { Text = "用户名:" }; usernameText = new TextField(""); usernameText.X = Pos.Right(usernameLabel); usernameText.Y = Pos.Bottom(usernameLabel) - 1; var passwordLabel = new Label() { Text = "密码:" }; passwordText = new TextField(""); passwordText.Secret = true; passwordText.X = Pos.Left(usernameText); passwordText.Y = Pos.Bottom(passwordLabel) + 5; // 创建登录按钮 var btnLogin = new Button() { Text = "登录" }; btnLogin.X = Pos.Center(); btnLogin.IsDefault = true; // 单击登录按钮时显示消息弹出 btnLogin.Clicked += (sender, e) => { if (usernameText.Text == "admin" && passwordText.Text == "123456") { MessageBox.Query("登录结果", "登录成功", "Ok"); } 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技术交流平台。无论您是初学者还是有丰富经验的开发者,我们都希望能为您提供更多的价值和成长机会。欢迎加入DotNetGuide技术社区微信交流群👪。

正文

前言

前段时间分享了一个库帮你轻松的创建漂亮的.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控制台应用相似的内容:

使用Terminal.Gui构建功能强大的.NET控制台应用

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

使用 Alacritty 替代 Gnome-Terminal 解决 Ubuntu 中终端的行间距问题

之前有篇随笔主要揭露了 Ubuntu 22.04 中 Terminal 中的行间距过大的问题,该问题对 Powerline 类的主题影响尤其大。关键是对于这个问题,网上反映的人很少,我也很郁闷。经过长时间关注,终于找到一个可以完美替代 Gnome-Terminal 的终端软件,可以解决以上问题,特推...

使用虚拟机搭建代码托管、持续集成系统

目录 目录 摘要 下载镜像 安装系统 创建虚拟机 安装系统 检查网络 开启 SSH 远程登录功能 使用 windows powershell 连接终端 Windows Terminal 添加快速访问终端 端口映射 防火墙设置 外网访问 Tailscale 安装与使用 自建中继服务器 共享主机文件夹

【转帖】用pycharm开发django项目示例

https://www.cnblogs.com/kylinlin/p/5184592.html pycharm开发django工程(一) 在pycharm(企业版)中新建Django工程,注意使用虚拟环境 创建成功后,在pycharm显示的工程目录结构如下: 打开pycharm的Terminal,进

CentOS7下搭建JumpServer(v2.28.6) 堡垒机

JumpServer 部署架构图 JumpServer 功能架构图 JumpServer 是广受欢迎的开源堡垒机,是符合 4A 规范的专业运维安全审计系统。 JumpServer 使用 Python 开发,配备了业界领先的 Web Terminal 方案,交互界面美观、用户体验好。 JumpServ

设置Windows主机的浏览器为wls2的默认浏览器

这里以Chrome为例。 1. 准备工作 wsl是可以使用Windows主机上安装的exe程序,出于安全考虑,默认情况下改功能是无法使用。要使用的话,终端需要以管理员权限启动。 我这里以Windows Terminal为例,介绍如何默认使用管理员权限打开终端,具体操作如下图所示: 2. 操作 wsl

【Azure Developer】在Github Action中使用Azure/functions-container-action@v1配置Function App并成功部署Function Image

问题描述 使用Github Action,通过 Azure/functions-container-action@v1 插件来完成 yaml 文件的配置,并成功部署Function Image 的过程记录。 操作步骤 第一步: 准备Function的镜像文件 如在VS Code中,通过Termina

使用Cloudflare Worker加速docker镜像

前言 开发者越来越难了,现在国内的docker镜像也都️了,没有镜像要使用docker太难了,代理又很慢 现在就只剩下自建镜像的办法了 GitHub上有开源项目可以快速搭建自己的镜像库,不过还是有点麻烦,还好Cloudflare暂时还活着‍ 本文记录一下使用 Cloudf

使用C#/.NET解析Wiki百科数据实现获取历史上的今天

创建一个webapi项目做测试使用。 创建新控制器,搭建一个基础框架,包括获取当天日期、wiki的请求地址等 创建一个Http请求帮助类以及方法,用于获取指定URL的信息 使用http请求访问指定url,先运行一下,看看返回的内容。内容如图右边所示,实际上是一个Json数据。我们主要解析 大事记 部

Pybind11和CMake构建python扩展模块环境搭建

使用pybind11的CMake模板来创建拓展环境搭建 从Github上下载cmake_example的模板,切换分支,并升级pybind11子模块到最新版本 拉取pybind11使用cmake构建工具的模板仓库 git clone --recursive https://github.com/mr