前言
前段時間分享了
的文章教程,然後就有小夥伴提問:
.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
學習是一個永無止境的過程,你知道的越多,你不知道的也會越多,在有限的時間內堅持每天多學一點,你一定能成為你想要成為的那個人。不積跬步無以至千裏,不積小流無以成江河!!!