顏色和樣式與可重用性 - Spectre Console 系列
[[academy-video-youtube({"vid": "w4-YfRUawYM", "start_time": "0", "title": "Colors and Styles and Reusability - Spectre Console Series", "creator": "Tim Corey", "length": "9m 57s"})]]
Spectre Console 是一個強大的 NuGet 套件,適用於 .NET,允許開發者將普通的控制台應用轉變為視覺豐富的體驗。 通過結合 Spectre Console 的顏色、文字裝飾和可重用樣式,您可以將普通的控制台輸出提升為資訊豐富且精緻的形式。
在他的影片"顏色、樣式和可重用性 – Spectre Console 系列"中,Tim Corey 詳細介紹了如何做到這一點。 在這篇文章中,我們將按照 Tim 所做的步驟,指出時間戳,以便您可以同步觀看。 這是一個了解如何建立和自定義顏色、樣式類,甚至是為重複使用建立新樣式的好方法。
Spectre Console 格式化的介紹
在 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,他演示了前景和背景顏色—"Red on White"—因此使用者可以看到白色背景上的紅色文字。 到 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 來修正這一點,這會將游標下移。
這個小技倆可以確保您的輸出符合預期——這在構建較大的控制台應用程式時很重要,因為使用者輸入或資料會出現在樣式提示後。
新增多個裝飾
Tim 接著展示了如何結合裝飾。 在 6:27,他說,"如果您想應用多於一個裝飾怎麼辦?" 例如,我還想應用斜體。" 您可以通過使用單個管道字元來分隔裝飾做到這一點。
在 7:05 他顯示您可以從一個長的裝飾列表中選擇——粗體、斜體、刪除線、下劃線、變暗、反相、閃爍——甚至在 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 時將其應用於 Markup 物件。
Tim 鼓勵觀眾在 9:26 "用不同的顏色和背景和裝飾以及所有其他..." 試試它們。這包括建立新表格,具有樣式化的標頭,新增一個在處理文件或項目陣列時更新的進度條,甚至將 JSON 資料轉換為樣式化顯示。
他在 9:33 結束時感謝觀眾,並提醒他們他是 Tim Corey。 本系列基於由 Patrik Svensson 建立的 Spectre Console 庫,並由如 Phil Scott 等開發者貢獻,Tim 的影片幫助您快速掌握其功能。
結論
Tim Corey 的影片清楚地顯示了 Spectre Console 怎樣將普通的控制台應用程式變得更具視覺吸引力。 從內嵌標記到完全可重用的樣式類,他逐步講解了如何控制前景和背景顏色、文字裝飾和游標位置。
如果您按照上面的時間戳與 Tim 的例子一起操作,您將能夠在不猜測語法的情況下,快速為自己的控制台應用增加具有專業外觀的樣式。 一旦您知道如何分配變數、新增裝飾和渲染樣式化文字,您就可以輕鬆地擴展這些技能,建立表格、面板、進度條以及 Spectre Console 提供的其他功能。
正如 Tim 所說:"試試看……看看您喜歡什麼。"

