自定義等待旋轉器 - Spectre Console系列
Spectre Console是一個.NET程式庫,可讓您建立具有豐富輸出、顏色和格式化功能的美麗主控台應用程式。 Tim Corey 在他 "建置自訂等待旋轉器 - Spectre Console 系列" 的影片中開始時提醒我們,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]文本[/]),或者如果您的控制台支援,可以嘗試使用 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]載入中...[/green]以強調成功,或在需要時用紅色文本突出錯誤。
性能提示和設置
在5點19分,Tim總結了您為自定義旋轉器所需的關鍵事項:
- 時間:每幀顯示的時間長度。
IsUnicode:是否使用Unicode/表情符號或純文字。
- Frames:您動畫的字串陣列。
他警告說,過多的幀數或過慢的速度意味著用戶可能永遠無法看到最後的幀,除非您的處理過程非常長。 在這裡選擇正確的選項可以讓您的轉盤更加有效。這些設定還能讓您隨著時間逐步增進專案更為容易——您可以增加更多的幀數或調整時間而不需要重寫整個控制台應用程式。
總結
在5:38時,Tim展示如何通過繼承自Spinner類並提供您自己的值,可以快速為您的控制台或PowerShell工具構建自訂的載入指示器。 這讓您可以更好地控制您提供給用戶的資訊和感受。 在5:47時,他提醒觀眾源代碼和文件位於影片描述中,您可以自行探索和擴展。
結論
根據Tim Corey的影片,我們看到了如何實現自訂的Spectre Console加載旋轉器:繼承自Spinner,提供一個時間值,指定Unicode支援,並定義您的幀。 然後只需用您的新類別替換已知的旋轉器,以便將其添加到您的專案中。 Tim 也指出了添加 Unicode 字元、表情符號和色彩標記的方法,以使您的主控台應用程式的狀態和進度顯示更具資訊性和美觀性。
透過使用Spectre Console的功能,您可以提供更明確的反饋、更早發現並修復問題,並創造出使用者喜愛的精美控制台應用程式。
