Чи можна записати на консоль кольоровим кольором у .NET?


184

Написавши невеликий інструмент командного рядка, було б непогано виводити різні кольори. Чи можливо це?

Відповіді:


247

Так. Дивіться цю статтю . Ось приклад звідти:

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
Якщо записати з декількох потоків без синхронізації, це призведе до виходу зі слів, навіть якщо не зміниться колір: це не лише зміна кольорів, що спричиняє стан перегонів
Joe

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 у нас є ще одна проблема, якщо ви хочете "зберегти" досвід користувача, оскільки термінали мають різні кольори в кожній операційній системі.

Я створюю бібліотеку, яка вирішує цю проблему за допомогою Формат тексту: кольори, вирівнювання та багато іншого. Не соромтеся використовувати та сприяти.

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

Кольори для Windows / Linux (темний):
введіть тут опис зображення

Кольори для MacOS (Світло):
введіть тут опис зображення


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.