自定義等待微調器 - Spectre Console 系列
[[academy-video-youtube({"vid": "3Hl3k87UvpY", "start_time": "0", "title": "建立自訂等待旋轉器 - Spectre Console 系列", "creator": "Tim Corey", "length": "6分12秒"})]]
Spectre Console是一個.NET程式庫,可讓您建立具有豐富輸出、顏色和格式化的漂亮控制台應用程式。 Tim Corey 在他的"Build a Custom Waiting Spinner - Spectre Console Series"影片中提醒我們,Spectre Console 可以將普通的C#控制台應用程式變成更具視覺吸引力和資訊豐富的工具。 在這節課中,Tim 將展示如何實現自定義載入旋轉器——一個小但強大的功能,可以讓您的控制台程式的狀態和進度指示器更易於跟蹤。
Tim 在 0:16 解釋說該專案的源程式碼鏈結位於影片的下方。 他鼓勵觀眾自己測試和實驗,改變設置或新增功能,以了解它在自己環境中的運作方式。 這特別有用,如果您想支援不同的終端,如Windows Terminal或PowerShell,因為它們對Unicode字元的行為略有不同。
使用內建的旋轉器
Tim從一個簡單的例子開始。 在0:37,他使用AnsiConsole.Status編寫程式碼,以顯示已知的載入樣式,同時在背景中執行某些工作。 他選擇Spinner.Known.Aesthetic,但指出Spectre在Spinner.Known列表中提供了許多選項。Tim新增了一個字串"Loading"顯示在旋轉器旁邊,以便使用者知道正在進行什麼。
在狀態區塊中,Tim 插入了一個 Thread.Sleep(10000)——十秒鐘——僅供測試。 這強制控制台顯示旋轉器運行的時間足夠長,使其可見。 他在1:23解釋說,一旦任務完成,旋轉器就會自動消失。 這是Spectre在控制台應用程式中顯示狀態或進度的預設模式。
邁向定制的載入動畫
在1:41,Tim說:"好的,我們來建立一個自訂旋轉器",展示如何超越內建選項。 他解釋說,有時您希望將載入中旋轉器的格式或樣式與您自己的專案、品牌顏色,甚至您正在處理的資料型別相匹配。 通過編寫您自己的旋轉器類,您可以控制幀、時間安排,以及是否使用Unicode字元。
建立Spinner類別
Tim 建立了一個名為 TestSpinner.cs 的新檔案。 在2:05,他將類別設為公開,並設為繼承自Spectre的抽象Spinner類別。 他使用Visual Studio的"實作抽象類別"功能來生成所需的成員。 這是您提供自己的值的位置 — 例如速度、幀和Unicode設置 — 而不是使用預設值。
Tim 在 2:18 強調這些是僅可獲取的屬性,這使得編寫運算式主體成員更為簡單。 此格式保持您的旋轉器定義精簡,使其更易於維護或日後更新。
控制每幀速度
在2:30,Tim將時間屬性設置為TimeSpan.FromMilliseconds(200)。 這意味著旋轉器將以每秒約五幀的速度移動。 他解釋說,您可以選擇不同的值,如果您希望旋轉器運行得更快或更慢。 根據您的指令或過程正在執行的任務,調整此設定是一種簡單的方法來改善載入動畫的感覺。
處理Unicode字元
在3:00,Tim提出了一個關鍵問題:Unicode。 他指出,當您在Visual Studio內建的控制台中運行專案時,Unicode字元可能無法正確呈現,導致錯誤或符號缺失。 然而,如果您在 Windows Terminal 或 PowerShell 中運行相同的專案,通常 Unicode 和表情符號顯示良好。在他的演示中,他將該屬性設置為 false 以避免此問題,但他指出當您的終端支援時,可以將其設置為 true。
這讓您更容易在您的應用程式中新增色彩豐富的符號、箭頭,甚至是基於表情符號的進度指標。您可以使用✅、🌧、🔄或任何您想要的字元來格式化框架,以提供更豐富的資訊。
定義框架
接下來的屬性是框架列表。在3:34時,Tim寫了一個返回字串陣列的箭頭函式。 每個字串都是旋轉器的一個"框架"。 在他的例子中,他使用一個大寫的"O"和幾個小寫的"o"來模擬沿線的移動。
他複製並貼上基本框架五次,然後在 4:12 更換每個框架中不同位置的一個"O"。 這會建立一個簡單的動畫:大的"O"從左向右移動,然後迴圈回到開始。 Tim 注意到在 4:26,您可以新增更多框架來反轉方向,新增顏色格式(Spectre 支援豐富的標記,例如 [green]text[/]),或者如果您的控制台支援,則嘗試使用 Unicode 字元。
這是 Tim 的 TestSpinner 類別程式碼:
using Spectre.Console;
namespaces SpectreDemos;
public class TestSpinner : Spinner
{
public override TimeSpan Interval => TimeSpan.FromMilliseconds(200);
public override bool IsUnicode => false;
public override IReadOnlyList<string> Frames =>
[
"Ooooo",
"oOooo",
"ooOoo",
"oooOo",
"ooooO"
]
}using Spectre.Console;
namespaces SpectreDemos;
public class TestSpinner : Spinner
{
public override TimeSpan Interval => TimeSpan.FromMilliseconds(200);
public override bool IsUnicode => false;
public override IReadOnlyList<string> Frames =>
[
"Ooooo",
"oOooo",
"ooOoo",
"oooOo",
"ooooO"
]
}實作與測試自訂微調器
定義類別後,Tim 回到他的主程式。 在4:42,他將Spinner.Known.Aesthetic替換為新的TestSpinner()。 就是這樣 — 不需要其他的程式碼變更。 然後,他在4:52執行應用程式以展示新的載入動畫。

此測試步驟非常重要。 Tim 建議您在與使用者相同的終端執行您的專案,以便及早發現編碼、顏色或時間上的問題。 不同的Shell和字體會影響您的旋轉器顯示效果。

新增 Unicode、表情符號和顏色
Tim 在5:00解釋說,如果您啟用 Unicode,沒有什麼可以阻止您使用表情符號或特殊字元作為框架。 您可以使用Spectre的標記來構建一個天氣旋轉器、一個綠色進度條或任何適合您應用程式的創意顯示。 這對於需要很長時間才能啟動或繼續運行的命令特別有用,因為使用者欣賞明確的視覺反饋。
他還指出,Spectre Console 使得為您的旋轉器新增顏色和格式化文字變得更加簡單。 例如,您可以在載入動畫旁邊寫上[green]載入中...[/]以強調成功,或者在需要時用紅色文字突出錯誤。
效能提示與設定
在5:19,Tim總結了您需要自訂旋轉器的關鍵事項:
時間:每幀顯示的時間長度。
IsUnicode:是否使用Unicode/表情符號或純文字。
- Frames: 您動畫的字串陣列。
他警告說,如果幀數過多或速度過慢,可能會導致使用者無法看到最後的幀,除非您的過程非常長。 在此選擇正確的選項可以使您的旋轉器更有效。這些設定也使您更容易隨著時間推進專案——您可以增加更多畫面或調整時間,而不需重寫整個控制臺應用程式。
總結
在5:38時,Tim展示了通過繼承自Spinner類別並提供您自己的值,您可以快速為您的控制台或基於PowerShell的工具構建自訂的載入指示器。 這讓您能更好地控制您提供給使用者的資訊和感受。 在5點47分時,他提醒觀眾,來源程式碼和文件在影片描述中,以便您自己探索和擴展。
結論
根據Tim Corey的影片,我們清楚地學習到如何實作一個自訂的Spectre Console載入指示器:繼承自Spinner、提供時間值、指定Unicode支援,並定義您的動畫幀數。 然後只需用您的新類別替換已知的旋轉器,即可將其新增到您的專案中。 Tim還指出了如何新增Unicode字元、表情符號和顏色標記以使您的控制台應用程式的狀態和進度顯示更加資訊豐富和美觀的方法。
通過使用Spectre Console的功能,您可以提供更清晰的反饋、更早地發現和修復問題,並建立使用者喜愛的漂亮控制台應用程式。

