Creando aplicaciones de consola bonitas en .Net con Spectre.Console
En varias oportunidades he tenido que crear aplicaciones de consola que van actualizando la pantalla a medida que va pasando el tiempo o sucede algo, termino teniendo cosas como en la siguiente captura de pantalla
Tratando de mejorar esto, podemos reformatear la informacion y utilizar un Console.Clear();
para repintar la pantalla, lo cual nos da una salida como la siguiente
El problema surge cuando es mucha la informacion que queremos presentar y el armado de la pantalla se vuelve rapidamente muy complicado
Para facilitar este proceso, podemos recurrir a Spectre.Console, que nos permitira crear aplicaciones de consola mucho mas bonitas
Instalacion
Solo es necesario agregar una referencia al paquete NuGet de Spectre.Console.
## Uso
Una de las funcionalidades disponibles es el uso de Markup, el cual permite enviar texto enriquecido a la consola, como puede verse en el siguiente ejemplo
string color;
switch (loadPercentage)
{
case > 80:
color = "red";
break;
case > 30:
color = "yellow";
break;
default:
color = "green";
break;
}
AnsiConsole.Markup($"CPU usage [{color}]{loadPercentage}[/]%");
Tambien podemos crear widgets como una Table con el siguiente codigo
// 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);
Otra funcionalidad muy interesante, son los componentes Live que nos permiten modificar solo una parte de la informacion mostrada, sin necesidad de reescribir toda la pantalla.
Vemos en el siguiente codigo como usar un Live-Display con una tabla, y luego usamos el contexto para refrescar la pantalla
AnsiConsole.Live(computerInfo.Table).Start(ctx =>
{
do
{
while (!Console.KeyAvailable)
{
computerInfo.GenerateFormattedOutput();
ctx?.Refresh();
Thread.Sleep(1000);
}
} while (Console.ReadKey(true).Key != ConsoleKey.Escape);
});
Dentro de nuestro metodo GenerateFormattedOutput
actualizaremos la tabla de la siguiente manera
Table.UpdateCell(0, 1, $"[{color}]{loadPercentage}[/]%");
Codigo de ejemplo
Pueden acceder a un proyecto en el siguiente repositorio de github, en el cual se encuentra un ejemplo completo de la funcionalidad mostrada en este post
Conclusion
Como pueden ver, es muy sencillo de utilizar, yo aqui solo he mencionado funcionalidad basica, pero en el sitio del proyecto pueden ver todos los casos de uso, y pantallas mostrando gran cantidad de informacion y otros controles