當前位置: 妍妍網 > 碼農

使用Terminal.Gui構建功能強大的.NET控制台套用

2024-07-04碼農

前言

前段時間分享了 的文章教程,然後就有小夥伴提問: .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 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


  • 學習是一個永無止境的過程,你知道的越多,你不知道的也會越多,在有限的時間內堅持每天多學一點,你一定能成為你想要成為的那個人。不積跬步無以至千裏,不積小流無以成江河!!!

    See you next good day