Можно ли писать в консоль в цвете в .NET?


184

Написание небольшого инструмента командной строки было бы неплохо выводить разными цветами. Это возможно?

Ответы:


248

Да. Смотрите эту статью . Вот пример оттуда:

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

введите описание изображения здесь


3
Можно ли добавить фоновое изображение?
RollRoll

@RollRoll не входит в стандартный cmd.exe. Вы можете попробовать использовать консольный эмулятор, который поддерживает настройку фонового изображения, но, тем не менее, это не может быть сделано программно в любом случае.
Ремигиуш Шоида,

+1 Когда ты занимался этим более 10 лет и только сейчас узнал то, что они знали 10 лет назад .... это никогда не стареет, ха.
Шут

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

Взято отсюда .


54

Выше комментарии являются твердыми ответами, однако обратите внимание, что они не являются потокобезопасными. Если вы пишете на консоль с несколькими потоками, изменение цвета добавит условие гонки, которое может создать странный внешний вид. Это легко исправить, хотя:

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
Запись из нескольких потоков без синхронизации приведет к искаженному выводу, даже если нет изменений цвета: не только изменение цвета вызывает состояние гонки
Джо

6
@Joe Один Writeзвонок не будет искажен. См. Stackoverflow.com/questions/4812508/… . Это просто порядок записи вызовов, который не является «безопасным».
BatteryBackupUnit

27

Я создал небольшой плагин (доступный на NuGet ), который позволяет вам добавлять любой (если поддерживается вашим терминалом) цвет к выводу вашей консоли, без ограничений классических решений.

Это работает, расширяя Stringобъект, и синтаксис очень прост:

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

Поддерживаются цвета переднего плана и фона.

введите описание изображения здесь


1
Это действительно удивительный кусок кода. Я ценю возможность в основном деактивировать расширение всего цвета. Подходит для использования опции цвета в linux (ls –color = auto).
MianenCZ

13

Да, это легко и возможно. Определите первые цвета по умолчанию.

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

Console.Clear()это важно для того, чтобы установить новые цвета консоли. Если вы не сделаете этот шаг, вы можете увидеть комбинированные цвета, когда запрашиваете значения с Console.ReadLine().

Затем вы можете изменить цвета на каждом принте:

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

Когда закончите свою программу, не забудьте сбросить цвета консоли при завершении:

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

Теперь с netcore у нас есть другая проблема, если вы хотите «сохранить» пользовательский интерфейс, потому что терминалы имеют разные цвета в каждой операционной системе.

Я делаю библиотеку, которая решает эту проблему с помощью Text Format: цвета, выравнивание и многое другое. Не стесняйтесь использовать и внести свой вклад.

https://github.com/deinsoftware/colorify/, а также доступен в виде пакета NuGet

Цвета для Windows / Linux (Dark):
введите описание изображения здесь

Цвета для MacOS (Light):
введите описание изображения здесь


6

Просто добавьте к ответам выше, которые все используют Console.WriteLine: чтобы изменить цвет в той же строке текста, напишите, например:

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

4

Да, это возможно следующим образом. Эти цвета можно использовать в консольном приложении для просмотра ошибок красного цвета и т. Д.

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

Вот простой метод, который я написал для написания консольных сообщений со встроенными изменениями цвета. Он поддерживает только один цвет, но он соответствует моим потребностям.

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

    }

изображение консольного сообщения со встроенными изменениями цвета

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.