写点什么

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

作者:追逐时光者
  • 2025-10-20
    广东
  • 本文字数:3370 字

    阅读完需:约 11 分钟

前言

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



创建 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

发布于: 18 分钟前阅读数: 5
用户头像

不积跬步无以至千里,不积小流无以成江海! 2020-01-14 加入

微软MVP、华为云HCDE、华为云云享专家、51CTO专家博主、阿里云专家博主、博客园推荐博客、CSDN博客专家、腾讯云创作之星、掘金优秀创作者,一个热爱开源的全栈软件工程师,擅长C#、.NET、Vue等相关技术开发。

评论

发布
暂无评论
使用Terminal.Gui构建功能强大的.NET控制台应用_C#_追逐时光者_InfoQ写作社区