颜色和样式以及可重用性 - Spectre 控制台系列
Spectre Console 是一款功能强大的 .NET NuGet 软件包,允许开发人员将普通的控制台应用程序转变为视觉丰富的体验。 通过结合 Spectre Console 颜色、文本装饰和可重复使用的样式,您可以将普通的控制台输出提升为内容丰富的精美输出。
在他的视频"颜色、样式和可重用性 - Spectre 控制台系列"中,Tim Corey 向我们介绍了如何做到这一点。 在本文中,我们将逐步介绍蒂姆提出的相同要点,并指出时间戳,以便您可以一起观看。 这是了解如何创建和自定义颜色、样式类,甚至是重复使用的新样式的好方法。
Spectre 控制台格式化简介
0:00 时,Tim 解释说 Spectre Console "可以让您将控制台应用程序变成视觉上吸引人、内容丰富的应用程序"。他指出,这个系列将库分成小块,这样开发人员就可以一次专注于一项功能。
他在描述中指出了源代码链接,并邀请用户订阅他的频道。 本课的重点是如何在控制台输出中设置和返回格式化文本,以及如何在整个程序中重复使用这些格式。
使用内联标记和 MarkupLine
0:36 时,Tim 开始演示 AnsiConsole.MarkupLine 和 AnsiConsole.Markup。这些方法可以让您直接在字符串表示中嵌入颜色和装饰。
正如 Tim 在 0:51 所解释的,Markup 不会自动插入新行,而 MarkupLine 则会--"这有点像 Console.Write 与 WriteLine"。当你想在不同的行上显示多个项目或列表时,这种区别就很重要了。
他输入 ([red]This is the inline markup[/] )并运行,显示出一个红色字符串。 然后,在 1:38 处,他演示了前景色和背景色--"白底红字"--这样用户就能看到白底红字。 到 2:05 时,他添加了黑体作为装饰。
Tim 在 2:18 指出,内联标记对于小操作来说快速而简单,但当你希望在不同功能间使用更有结构或可重复使用的样式时,"它对于所有其他操作来说并不是很好"。

创建预设样式类
在 2:32 处,Tim 演示了如何创建一个样式类的新实例以供重用。 他写道
var dangerStyle = new Style(
foreground: Color.Red,
background: Color.White,
decoration: Decoration.Bold);var dangerStyle = new Style(
foreground: Color.Red,
background: Color.White,
decoration: Decoration.Bold);在这里,Tim 指定了一个名为 dangerStyle 的变量,其中包含一个前景为红色、背景为白色、装饰为粗体的新样式。 他还指出,在 3:26 处,您不必填充每个论点--您可以根据需要只选择前景或装饰。
这种基于类的方法使您能够在一个地方更新样式,并在呈现文本的任何地方一致地应用,而不是重复标记标签。
使用新标记应用样式
在 3:48 处,Tim 演示了如何应用这种风格。 由于 AnsiConsole.WriteLine 不能直接接受样式,因此您必须使用带有新标记对象的 AnsiConsole.Write:
AnsiConsole.Write(
new Markup("Danger text from style", dangerStyle));AnsiConsole.Write(
new Markup("Danger text from style", dangerStyle));在 4:08 处,他解释说 WriteLine 只接受字符串或简单类型,但 Write 有一个接受 IRenderable 对象的重载。 这就是为什么您要将自己的风格传递给新的标记,然后再进行编写。
Tim 在 4:45 指出,这种语法 "比较费事",但它是显示样式化文本的官方方式。 他甚至建议,如果你经常这样做,可以创建自己的方法来简化翻译。

处理换行和光标位置
运行代码后,Tim 在 5:44 处指出光标与样式文本位于同一行。 这是因为 Write 不会添加新行。在 6:07 处,他展示了如何通过在字符串内添加 \n 来解决这个问题,这样光标就会向下移动。
这个小技巧可以确保您的输出符合您的期望--这在构建大型控制台应用程序时非常重要,因为在这些应用程序中,用户输入或数据会出现在样式提示之后。
添加多个装饰
接下来,蒂姆演示了装饰的组合。 在 6:27 处,他说:"如果您想应用多个装饰怎么办? 例如,我也想使用斜体"。您可以使用单个管道字符来分隔装饰。
他向大家展示了一长串的装饰--粗体、斜体、删除线、下划线、变暗、反转、闪烁,甚至在 7:05 处提到了 Windows PowerShell 和 Windows 终端支持。目前,在 Windows 终端中,慢速闪烁和快速闪烁看起来是一样的。
到 7:29 时,他再次运行代码,显示除了粗体外,还应用了斜体样式。 "Tim 在 7 分 49 秒时说:"你可以随意混合和搭配这些内容,创造出可以重复应用的风格。
当您想用红色突出显示错误,用绿色突出显示成功信息,用黄色突出显示警告,或者用蓝色、紫色、兰色甚至栗色突出显示自定义标签时,Spectre Console 支持完整的 RGB 颜色集,这是一项强大的功能。
混合内联和预设样式
在 8:02 分,Tim 演示了如何将不同风格的 "写 "和 "写 "结合起来。 您可以多次调用 AnsiConsole.Write--首先使用您的样式文本,然后使用未样式或不同样式的文本--以突出显示一行的一部分。他展示了
AnsiConsole.Write(new Markup("Danger text", dangerStyle));
AnsiConsole.WriteLine(" and more");AnsiConsole.Write(new Markup("Danger text", dangerStyle));
AnsiConsole.WriteLine(" and more");正如 Tim 在 8:37 所解释的,这就是使用 Write 而不是 WriteLine 的原因:您可能只想突出显示文本的一部分,然后再返回正常样式。

该功能为您提供了一种灵活的方式来构建复合输出(可能是一个数据表、一个用于长期运行工作的进度条或一个包含多列的面板),并仅对某些项目或标签应用样式。
总结 - 您的选择
到 9:01 时,Tim 总结了备选方案:
使用 [color]text[/] 和 Markup 或 MarkupLine 进行内联样式设置,以便快速格式化。
- 或者使用 new Style() 创建新样式,并在调用 AnsiConsole.Write 时将其应用于标记对象。
9:26 时,Tim 鼓励观众 "尝试使用不同的颜色、背景和装饰以及其他所有东西"。这包括制作带有样式标题的新表格,添加一个进度条,在处理文件或项目数组时更新,甚至将 JSON 数据转换成样式显示。
在 9:33 结束时,他向观众表示感谢,并提醒他们他是 Tim Corey。 本系列以 Patrik Svensson 创建的 Spectre Console 库为基础,Phil Scott 等开发人员也参与其中,Tim 的视频将帮助您快速掌握其功能。
结论
Tim Corey 的视频清楚地展示了 Spectre Console 如何将普通的控制台应用程序变得具有视觉吸引力。 从内联标记到完全可重用的样式类,他一步一步地介绍了如何控制前景和背景颜色、文本装饰和光标位置。
如果您按照上面时间戳中 Tim 的示例进行操作,您就能在短时间内为自己的控制台应用程序添加专业的样式,而无需猜测语法。 一旦您知道如何分配变量、添加装饰和渲染样式文本,您就可以轻松地将这些技能扩展到构建表格、面板、进度条以及 Spectre Console 提供的其他功能。
正如 Tim 所说,"试试看......看看你喜欢什么"。

