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

7b2021d497b056ebfb94ba58b7a4b8a5.png

3c9965cbece812792ff93d31e03b7b51.jpeg

前言

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

823729153a8a8214b154add45dd0557b.gif

项目介绍

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

9350430c8fca8a51e7af06b69a432754.png

安装Terminal.Gui.Templates

dotnet new install Terminal.Gui.templates
3bf2ff690e84c1701c9ae8d69be25887.png

创建一个新的Terminal.Gui 模板项目

dotnet new tui -n TestTerminalGui
42bcd005b4221542259221a4bfa64173.png

编译并运行项目

cd TestTerminalGui
dotnet run
ed46cb3c82260eecb58d304e01fd71bb.png 38c78500f3bc85d0cbef1573f547e052.png

创建TerminalGuiExercise控制台应用

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

8b0c7a1c07b07242942fe90fa51e17eb.png 98a19a559363e1617b4de8dce07e8f61.png f47f4861bfe8a59f86ec92b9ec73c7a9.png

安装Terminal.Gui包

20183d9d991ebff23b5fee881cbf76b9.png

消息框代码

static void Main(string[] args)
        {
            #region 消息框代码

            Application.Init();

            MessageBox.Query(100, 15,
               "Question", "Do you like console apps?", "Yes", "No");

            Application.Shutdown();

            #endregion
        }
a46a90e5eaf1b09f517ef458fefd9f5f.png

简单的文本用户界面示例代码

创建一个简单的带菜单栏的文本用户界面示例代码:

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
        }
70500775db9d738ddcd8ac508f21d143.png

用户登录示例代码

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);
        }
    }
}
bae2d0acf5f4f76a356c9feb05b8206b.png faff2a31c53bc38952c677f20b74c6ad.png 96322a894bbf798d1073e562a86d200c.png

项目源码地址

更多项目实用功能和特性欢迎前往项目开源地址查看👀,别忘了给项目一个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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值