Ugly Console Applications
On several occasions, I have had to create console applications that update the screen as time passes or some background task progresses. When I do, I often end up with something that looks like the following screenshot:
This works just fine but can certainly be improved. We can reformat the data better and also use a Console.Clear(); to repaint the screen between updates, giving us an output that looks like the following:
The problem with this approach arises when there is a lot of information that we want to present on the screen, and assembling the entire screen can quickly become very complicated.
To facilitate this process, I like to use Spectre.Console, which will help us create much more beautiful console applications. Let me show you how.
Installing Spectre.Console
You can get started improving the look of your .NET console applications simply by adding a reference to the Spectre.Console NuGet package.
Usage
One of the available features is the use of Markup, which allows you to send rich text to the console, as can be seen in the following example
string color;
switch (loadPercentage)
{
case > 80:
color = "red";
break;
case > 30:
color = "yellow";
break;
default:
color = "green";
break;
}
AnsiConsole.Markup($"CPU usage [{color}]{loadPercentage}[/]%");
We can also create widgets like a Table with the following code
// Create a table
var table = new Table();
// Add some columns
table.AddColumn("Sensor");
table.AddColumn("Value");
// Add some rows
table.AddRow("CPU usage", $"[{color}]{loadPercentage}[/]%");
// Render the table to the console
AnsiConsole.Render(table);
Other exciting functionality is the Live components which allow you to modify only part of the displayed information without having to rewrite the entire screen.
You can also see the Live-Display feature demonstrated in the following code, which allows you to create a table and use changes to the underlying data to trigger it to refresh:
AnsiConsole.Live(computerInfo.Table).Start(ctx =>
{
do
{
while (!Console.KeyAvailable)
{
computerInfo.GenerateFormattedOutput();
ctx?.Refresh();
Thread.Sleep(1000);
}
} while (Console.ReadKey(true).Key != ConsoleKey.Escape);
});
Inside of the method GenerateFormattedOutput
we will update the table with
Table.UpdateCell(0, 1, $"[{color}]{loadPercentage}[/]%");
Code Example
You can access a project in the following Github repository, where you will find a complete example of the functionality shown in this post.
Conclusion
As you can see, it is pretty straightforward to use Spectre.Console to beautify your console applications. I have only scratched the surface of the most basic functionality here, so if you’d like learn more, you can find lots of examples, documentation, and sample screenshots on the Spectre.Console website.