带分组的多选列表 - Spectre 控制台系列
Spectre Console 是一个 .NET 库,可让您将普通 C# 控制台应用程序转变为视觉丰富的交互式工具。 您可以用颜色、布局和交互式选择来提示用户,而不是静态的黑白屏幕。 在本文中,我们将深入探讨其最强大的输入功能之一--多选提示,特别是如何使用选择组。
我们将按照 Tim Corey 的视频"Multi-Select Lists with Groupings - Spectre Console Series"中的演示进行翻译。 蒂姆会解释、展示代码并运行它,这样您就可以看到如何在自己的项目中实现它。 下面,每个标题都注明了该主题在视频中出现的大致时间,以便您直接跳转到该主题。
多选择提示简介
在视频开始时,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
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 支持自定义强调色,因此您的说明可以用绿色、蓝色、黄色、灰色或红色来突出关键部分。
重要的是告诉用户按空格键切换项目,按回车键接受答案(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",然后点击回车键,控制台就会打印出所选的选项(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)。 当他点击回车键时,控制台会打印出所有选定名称的组合(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() 查看多个或分组列表。
用户按 Space 键切换选择,按 Enter 键接受。
组标签本身可以切换,以便一次选择所有项目。
提示符可以显示带有 ChoiceLabel 属性的复杂对象,同时返回底层对象。
- 页面大小和滚动功能有助于在一页中提供更多选择。
以 Tim Corey 为例,利用他的常用名称和姓氏实际列表,您可以在自己的 Spectre Console 应用程序中快速实现简洁、用户友好的多选列表。

