多選列表與分組 - Spectre Console 系列
[[academy-video-youtube({"vid": "VIUANifUTWI", "start_time": "0", "title": "Multi-Select Lists with Groupings - Spectre Console Series", "creator": "Tim Corey", "length": "6m 21s"})]]
Spectre Console 是一個 .NET 程式庫,讓您可以將普通的 C# 控制台應用程式轉變成視覺上豐富的互動工具。 取代靜態的黑白螢幕,您可以使用顏色、佈局和互動選項來提示使用者。 在本文中,我們將深入探討其最強大的輸入功能之一——多選提示,特別是如何使用選擇群組。
我們將按照 Tim Corey 在他的视频"Multi-Select Lists with Groupings – Spectre Console Series"中的步驟進行。 Tim 進行了解釋、展示程式碼並執行,這樣您便可以了解如何在自己的專案中實現這一功能。 以下,每個標題都註明了影片中該主題出現的近似時間,讓您可以直接跳轉。
多選提示的介紹
在影片開始時,Tim Corey 提醒觀眾,Spectre Console 允許您"將 C# 控制台應用程式轉變成視覺上迷人的資訊應用程式"(0:02)。 他在影片系列中以十分鐘為一段,逐步介紹程式庫。 這個特別的影片專注於使用多選提示,要求使用者從一個或多個列表中選擇一個或多個選項(0:18)。
設置簡單的多選提示
Tim 一開始展示了他的程式碼中已經存在的兩個列表:
List<string> usualNames = new() {
"Tim Corey",
"Sue Storm",
"Bilbo Baggins",
"John Doe",
"Princess Donut",
"Steve Rogers"
};
List<string> familyNames = new() {
"Charity",
"Jon",
"Chris"
};List<string> usualNames = new() {
"Tim Corey",
"Sue Storm",
"Bilbo Baggins",
"John Doe",
"Princess Donut",
"Steve Rogers"
};
List<string> familyNames = new() {
"Charity",
"Jon",
"Chris"
};(You can see these on screen at about 0:38.)
他建立了一個名為 favoriteNames 的 List<string> ,因為使用者可能會選擇零、一個或多個項目(0:53–1:01)。 然後,他將其分配給 AnsiConsole.Prompt 與新的 MultiSelectionPrompt<string>() 的結果(1:05–1:16)。
Tim 強調,每個選項都將是一個字串物件,提示將返回一個或多個使用者選擇的選項的陣列或列表(1:20–1:26)。
接著,他新增了一個自訂標題以指導使用者:
.Title("Which are your favorite placeholder names?").Title("Which are your favorite placeholder names?")這會在提示的頂部設置一個清晰的標題(1:31–1:50)。
新增指導使用者操作的說明文字
Tim 不僅僅新增了標題。 他還新增了說明文字,告訴使用者如何與提示互動(1:50)。
他寫了一些像這樣的東西:
.InstructionsText("(Press <space> to toggle, <enter> to accept)").InstructionsText("(Press <space> to toggle, <enter> to accept)")在 1:56,他解釋了您甚至可以用顏色或其他樣式格式化它——Spectre Console 支援自訂強調色,這樣您的說明可以以綠色、藍色、黃色、灰色或紅色顯示,以突出關鍵部分。
重要的是告知使用者:按空格鍵切換項目,按 Enter 接受您的答案(2:12)。 這使得該腳本對使用者來說非常容易使用。
新增選擇項目並顯示結果
接下來,Tim 新增了實際資料。 起初他保持簡單,僅有一個列表。他使用 .AddChoices(usualNames)(2:24–2:34)。
然後他寫了一個簡單的 foreach 迴圈,將使用者的選擇列印回控制台(2:38–2:52):
foreach (var name in favoriteNames)
{
Console.WriteLine(name);
}foreach (var name in favoriteNames)
{
Console.WriteLine(name);
}他不關心格式化——只是顯示多選提示的工作原理(2:53–3:00)。
Tim 在終端中運行該程式(3:00)。 提示顯示了他的名字列表。 他使用空格鍵挑選一些項目——如"Tim Corey" 和 "Sue Storm"——然後按下 Enter,控制台列印出所選擇的選項(3:07–3:15)。 這顯示了最簡單的工作版本。

使用選擇群組移動到多個列表
基礎設置工作之後,Tim 讓事情變得"更加有趣"(3:22)。 他不只是一個列表,而是有兩個列表:usualNames 和 familyNames。
他註釋掉原始的 .AddChoices() 調用,並引入了 .AddChoiceGroup()(3:32–3:38)。 這允許他在標籤下分組相關項目。 他寫道:
.AddChoiceGroup("The usual names", usualNames)
.AddChoiceGroup("Family names", familyNames).AddChoiceGroup("The usual names", usualNames)
.AddChoiceGroup("Family names", familyNames)現在,每個群組將分別出現在提示中。 這種結構特別有用,當您呈現數十個選項時,想要將它們組織成頁面或群組。 即使這是文字記錄所未顯示的,Spectre Console 的多選提示還有一個 PageSize 屬性,所以當有更多選擇時,您可以控制一次顯示多少項。
瞭解運行時的群組選擇運作原理
Tim 保存並再次運行程式碼(4:11)。 新的提示顯示了雙方群組以及明顯的標籤。 如果他將游標移動到"The usual names"標籤並按下空格鍵,那麼該群組中的所有項將一次被選中(4:17–4:19)。
他還指出,如果列表長於螢幕,Spectre Console 會自動處理滾動——您會看到灰色的"上下移動以顯示更多選項"消息(4:25–4:31)。 這是可滾動列表的預設行為。
Tim 演示了滾動到家庭名稱,選擇它們,然後再選擇像 Sue Storm 這樣的個人(4:39–4:43)。 當他按下 Enter 時,控制台列印出所有選擇的組合名稱(4:45)。 這顯示了該功能如何顯示更多選項,讓您切換它們,然後返回一個所選物件的列表。

理解多選提示與選擇提示的區別
在 5:00 Tim 進行了一個總結說明。 多選提示的運作方式類似於普通的選擇提示,但返回的是您傳入的型別列表(5:03–5:08)。
您可以像他一樣新增說明文字,同時可以使用選擇群組進行組織,並選擇性地用一個鍵選擇整個群組(5:14–5:18)。 這使得大型或複雜選單更容易讓使用者管理。
這也暗示了 Spectre Console 能夠處理複雜物件:您的選擇物件可以不僅僅是字串。 您可以提供帶有 ChoiceLabel 屬性的物件,以控制顯示內容,而當使用者接受其答案時仍返回完整物件。
靈活使用選擇群組和標籤
Tim 還澄清,您不必有兩個群組來使用 .AddChoiceGroup()(5:20–5:24)。 即使只有一個群組,您仍然可以選擇整個群組。
他展示您可以將群組命名為類似於"Select All"以更具泛用性(5:34–5:42)。 然後選擇頂部條目會切換所有以下項目(5:44–5:47)。 您還可以使用顏色高亮,例如將群組標籤設置為綠色或藍色以區分它—引導使用者尋找預設或必須的群組。這讓您在設計提示時有很多靈活性。
總結
Tim 以總結結束影片:這就是如何使用 Spectre Console 進行多選提示,包括為群組選擇新增選擇群組(5:50–5:53)。 一如既往,源程式碼位於說明中(5:57)。
Tim Corey 示範的要點
Spectre Console 多選讓使用者可以從列表中選擇零、一個或多個項目。
新增標題和說明文字以指導使用者; 您可以使用強調色來突出需要的資訊。
使用 .AddChoices() 來簡單列表;使用 .AddChoiceGroup() 來多個或分組列表。
使用者按空格鍵切換選擇,按 Enter 接受。
群組標籤本身可以切換以一次選擇所有項目。
提示可以顯示帶有 ChoiceLabel 屬性的複雜物件,同時返回基礎物件。
- 當您有多於一頁的選項時,頁面大小和滾動功能有助於顯示。
通過遵循 Tim Corey 的範例——使用他實際的通常名稱和家庭名稱列表——您可以快速在自己的 Spectre Console 應用中實現乾淨、使用者友好的多選列表。

