È possibile scrivere sulla console a colori in .NET?


184

Scrivendo un piccolo strumento da riga di comando, sarebbe bello produrre in diversi colori. È possibile?

Risposte:


247

Sì. Vedere questo articolo . Ecco un esempio da lì:

Console.BackgroundColor = ConsoleColor.Blue;
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine("White on blue.");

inserisci qui la descrizione dell'immagine


3
è possibile aggiungere un'immagine di sfondo?
RollRoll

@RollRoll non nel cmd.exe predefinito. Puoi provare a utilizzare un emulatore di console, che supporta la modifica delle immagini di sfondo, ma comunque non può essere eseguito in modo programmatico.
Remigiusz Schoida,

+1 Quando fai queste cose da oltre 10 anni e solo ora hai imparato quello che sapevano 10 anni fa .... questo non invecchia mai, ah.
Giullare

116
class Program
{
    static void Main()
    {
        Console.BackgroundColor = ConsoleColor.Blue;
        Console.ForegroundColor = ConsoleColor.White;
        Console.WriteLine("White on blue.");
        Console.WriteLine("Another line.");
        Console.ResetColor();
    }
}

Tratto da qui .


54

I commenti sopra sono entrambe risposte solide, tuttavia si noti che non sono thread-safe. Se stai scrivendo sulla console con più thread, la modifica dei colori aggiungerà una condizione di competizione che può creare un output dall'aspetto strano. È semplice da risolvere però:

public class ConsoleWriter
{
    private static object _MessageLock= new object();

    public void WriteMessage(string message)
    {
        lock (_MessageLock)
        {
            Console.BackgroundColor = ConsoleColor.Red;
            Console.WriteLine(message);
            Console.ResetColor();
        }
    }
}

10
Scrivere da più thread senza sincronizzazione comporterà un risultato confuso anche se non ci sono cambiamenti di colore: non è solo la modifica dei colori che causa una condizione di competizione
Joe

6
@Joe Una singola Writechiamata non sarà confusa. Vedi stackoverflow.com/questions/4812508/… . È solo l'ordine delle chiamate di scrittura che non è "sicuro".
BatteryBackupUnit

27

Ho creato un piccolo plugin (disponibile su NuGet ) che ti consente di aggiungere qualsiasi colore (se supportato dal tuo terminale) all'output della tua console, senza i limiti delle soluzioni classiche.

Funziona estendendo l' Stringoggetto e la sintassi è molto semplice:

"colorize me".Pastel("#1E90FF");

Sono supportati sia i colori di primo piano che quelli di sfondo.

inserisci qui la descrizione dell'immagine


1
Questo è un pezzo di codice davvero sorprendente. Apprezzo l'opzione per disattivare sostanzialmente l'estensione del colore intero. Si adatta all'uso dell'opzione color in linux (ls –color = auto).
MianenCZ,

13

Sì, è facile e possibile. Definire i primi colori predefiniti.

Console.BackgroundColor = ConsoleColor.Black;
Console.ForegroundColor = ConsoleColor.White;
Console.Clear();

Console.Clear()è importante per impostare i nuovi colori della console. Se non esegui questo passaggio puoi vedere i colori combinati quando chiedi i valori con Console.ReadLine().

Quindi puoi cambiare i colori su ogni stampa:

Console.BackgroundColor = ConsoleColor.Black;
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Red text over black.");

Al termine del programma, ricorda di ripristinare i colori della console al termine:

Console.ResetColor();
Console.Clear();

Ora con netcore abbiamo un altro problema se si desidera "preservare" l'esperienza dell'utente perché i terminali hanno colori diversi su ciascun sistema operativo.

Sto creando una libreria che risolve questo problema con il formato testo: colori, allineamento e molto altro. Sentiti libero di usare e contribuire.

https://github.com/deinsoftware/colorify/ e disponibile anche come pacchetto NuGet

Colori per Windows / Linux (scuro):
inserisci qui la descrizione dell'immagine

Colori per MacOS (Light):
inserisci qui la descrizione dell'immagine


6

Solo per aggiungere alle risposte sopra che tutti usano Console.WriteLine: per cambiare colore sulla stessa riga di testo, scrivi ad esempio:

Console.Write("This test ");
Console.BackgroundColor = bTestSuccess ? ConsoleColor.DarkGreen : ConsoleColor.Red;
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine((bTestSuccess ? "PASSED" : "FAILED"));
Console.ResetColor();

4

Sì, è possibile come segue. Questi colori possono essere utilizzati in un'applicazione console per visualizzare alcuni errori in colore rosso ecc ...

Console.BackgroundColor = ConsoleColor.Blue;
Console.ForegroundColor = ConsoleColor.White;//after this line every text will be white on blue background
Console.WriteLine("White on blue.");
Console.WriteLine("Another line.");
Console.ResetColor();//reset to the defoult colour

3

Ecco un metodo semplice che ho scritto per scrivere messaggi di console con cambi di colore in linea. Supporta solo un colore, ma si adatta alle mie esigenze.

    // usage: WriteColor("This is my [message] with inline [color] changes.", ConsoleColor.Yellow);
    static void WriteColor(string message, ConsoleColor color)
    {

        var pieces = Regex.Split(message, @"(\[[^\]]*\])");

        for(int i=0;i<pieces.Length;i++)
        {
            string piece = pieces[i];

            if (piece.StartsWith("[") && piece.EndsWith("]"))
            {
                Console.ForegroundColor = color;
                piece = piece.Substring(1,piece.Length-2);          
            }

            Console.Write(piece);
            Console.ResetColor();

        }

        Console.WriteLine();

    }

immagine di un messaggio della console con cambi di colore in linea

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.