Ist es möglich, in .NET farbig auf die Konsole zu schreiben?

183

Wenn Sie ein kleines Befehlszeilenprogramm schreiben, wäre es schön, in verschiedenen Farben auszugeben. Ist das möglich?

NibblyPig
quelle

Antworten:

245

Ja. Siehe diesen Artikel . Hier ist ein Beispiel von dort:

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

Geben Sie hier die Bildbeschreibung ein

Mark Byers
quelle
3
Ist es möglich, ein Hintergrundbild hinzuzufügen?
RollRoll
@RollRoll nicht in der Standard-cmd.exe. Sie können versuchen, einen Konsolenemulator zu verwenden, der das Anpassen von Hintergrundbildern unterstützt. Dies kann jedoch ohnehin nicht programmgesteuert durchgeführt werden.
Remigiusz Schoida
1 Wenn Sie schon seit mehr als 10 Jahren das Zeug zu tun und gerade jetzt gelernt , was sie vor 10 Jahren wussten .... das wird niemals alt, ha.
Jester
114
class Program
{
    static void Main()
    {
        Console.BackgroundColor = ConsoleColor.Blue;
        Console.ForegroundColor = ConsoleColor.White;
        Console.WriteLine("White on blue.");
        Console.WriteLine("Another line.");
        Console.ResetColor();
    }
}

Von hier genommen .

Darin Dimitrov
quelle
54

Die obigen Kommentare sind beide solide Antworten. Beachten Sie jedoch, dass sie nicht threadsicher sind. Wenn Sie mit mehreren Threads auf die Konsole schreiben, wird durch Ändern der Farben eine Race-Bedingung hinzugefügt, die zu einer seltsam aussehenden Ausgabe führen kann. Es ist jedoch einfach zu beheben:

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();
        }
    }
}
Roger Hill
quelle
10
Das Schreiben aus mehreren Threads ohne Synchronisation führt zu einer verstümmelten Ausgabe, auch wenn keine Farbänderungen vorliegen: Es ist nicht nur das Ändern der Farben, das eine Rennbedingung verursacht
Joe,
6
@ Joe Ein einzelner WriteAnruf wird nicht verstümmelt. Siehe stackoverflow.com/questions/4812508/… . Es ist nur die Reihenfolge der Schreibaufrufe, die nicht "sicher" ist.
BatteryBackupUnit
27

Ich habe ein kleines Plugin (verfügbar auf NuGet ) erstellt, mit dem Sie Ihrer Konsolenausgabe eine beliebige Farbe hinzufügen können (sofern dies von Ihrem Terminal unterstützt wird), ohne die Einschränkungen der klassischen Lösungen.

Es funktioniert durch Erweitern des StringObjekts und die Syntax ist sehr einfach:

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

Sowohl Vordergrund- als auch Hintergrundfarben werden unterstützt.

Geben Sie hier die Bildbeschreibung ein

Seidenfeuer
quelle
1
Das ist wirklich ein erstaunlicher Code. Ich schätze die Möglichkeit, die gesamte Farberweiterung grundsätzlich zu deaktivieren. Es eignet sich für die Verwendung der Farboption unter Linux (ls –color = auto).
MianenCZ
13

Ja, es ist einfach und möglich. Definieren Sie die ersten Standardfarben.

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

Console.Clear()Dies ist wichtig, um neue Konsolenfarben festzulegen. Wenn Sie diesen Schritt nicht ausführen, können Sie kombinierte Farben sehen, wenn Sie nach Werten mit fragen Console.ReadLine().

Dann können Sie die Farben auf jedem Druck ändern:

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

Denken Sie nach Beendigung Ihres Programms daran, die Konsolenfarben beim Beenden zurückzusetzen:

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

Jetzt mit Netcore haben wir ein weiteres Problem, wenn Sie die Benutzererfahrung "bewahren" möchten, da das Terminal auf jedem Betriebssystem unterschiedliche Farben hat.

Ich erstelle eine Bibliothek, die dieses Problem mit dem Textformat löst: Farben, Ausrichtung und vieles mehr. Fühlen Sie sich frei zu verwenden und beizutragen.

https://github.com/deinsoftware/colorify/ und auch als NuGet-Paket verfügbar

Farben für Windows / Linux (Dunkel):
Geben Sie hier die Bildbeschreibung ein

Farben für MacOS (Light):
Geben Sie hier die Bildbeschreibung ein

Equiman
quelle
6

Um die obigen Antworten zu ergänzen, die alle verwenden Console.WriteLine: Um die Farbe in derselben Textzeile zu ändern, schreiben Sie zum Beispiel:

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

Ja, es ist wie folgt möglich. Diese Farben können in einer Konsolenanwendung verwendet werden, um einige Fehler in roter Farbe usw. anzuzeigen.

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
Chamila Maddumage
quelle
2

Hier ist eine einfache Methode, die ich zum Schreiben von Konsolennachrichten mit Inline-Farbänderungen geschrieben habe. Es unterstützt nur eine Farbe, aber es entspricht meinen Bedürfnissen.

    // 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();

    }

Bild einer Konsolennachricht mit Inline-Farbänderungen

Walter Stabosz
quelle