Использование цветов в консоли, как хранить в упрощенной записи - PullRequest
5 голосов
/ 23 апреля 2010

В приведенном ниже коде показана строка разных цветов.
Но это достаточно кода, чтобы набрать только одну строку и повторить это снова во всей программе.
Как именно я могу упростить это, поэтому я ненужно писать один и тот же объем кода снова и снова?

        Console.ForegroundColor = ConsoleColor.Cyan;
        Console.Write(">>> Order: ");
        Console.ResetColor();
        Console.Write("Data");
        Console.ForegroundColor = ConsoleColor.DarkGreen;
        Console.Write("Parity");
        Console.ForegroundColor = ConsoleColor.Cyan;
        Console.Write(" <<<");

Есть ли способ сохранить ... = Console.ForegroundColor = ConsoleColor.Cyan;?

"текст" + цвет?+ «текст»;и т.д. ...

Любые пожелания приветствуются.

Ответы [ 7 ]

19 голосов
/ 23 апреля 2010

Не совсем понятно, что вы имеете в виду, но вы всегда можете создать вспомогательные методы:

public static void ColoredConsoleWrite(ConsoleColor color, string text)
{
    ConsoleColor originalColor = Console.ForegroundColor;
    Console.ForegroundColor = color;
    Console.Write(text);
    Console.ForegroundColor = originalColor;
}
9 голосов
/ 19 ноября 2013

Использование может использовать мою библиотеку Edokan.KaiZen.Colors .Это бесстыдная копия модуля npm colors для node.js.

Есть некоторые проблемы, но он работаетНа самом деле это работает так, как вы хотите.

Console.WriteLine("INFO: ".Cyan().Bold() + " This is just a message");
6 голосов
/ 13 июля 2010

Другая идея состоит в том, чтобы внедрить что-то вроде управляющих кодов ANSI , но они довольно обширны, а их цвет - лишь небольшая часть.

Поэтому я бы рекомендовал встраивать цветовые коды в выходные строки, используя раздел Области личного использования Unicode (PUA) в базовой многоязычной плоскости (BMP) и базовый анализатор / средство визуализации.

Кстати, настройки цвета консоли являются глобальными для процесса, поэтому, если несколько потоков генерируют цветной вывод, каждый блок должен быть окружен критической секцией, чтобы избежать "путаницы в цвете".

Поскольку встроить его довольно долго, я загрузил пример источника на мой сайт.

2 голосов
/ 01 марта 2018

Вы можете использовать библиотеку CsConsoleFormat † для форматирования вывода консоли в цвета.

Вот как будет выглядеть ваш код:

using static System.ConsoleColor;

ConsoleRenderer.RenderDocument(new Document().AddChildren(
    new Span(">>> Order: ") { Color = Cyan },
    new Span("Data") { Color = Gray },
    new Span("Parity") { Color = DarkGreen },
    new Span(" <<<") { Color = Cyan }
));

или, альтернативно:

ConsoleRenderer.RenderDocument(new Document().AddChildren(
    new Span { Color = Cyan }.AddChildren(
        ">>> Order: ",
        new Span("Data") { Color = Gray },
        new Span("Parity") { Color = DarkGreen },
        " <<<"
    )
));

или с кодом помощника (см. Ниже):

ColoredSpans.Render(">>> Order: ".Cyan(), "Data".Gray(), "Parity".DarkGreen(), " <<<".Cyan());

Два верхних метода, хотя и не очень добросовестны, имеют много преимуществ:

  • Обеспечение ясности намерений и поддержка иерархии, например, дочерние промежутки, добавленные в родительский промежуток, будут наследовать цвета родителя.
  • В отличие от ColoredConsoleWrite вспомогательного метода, создайте полный документ, который можно отрегулировать целиком (например, перенос слов, фон).
  • Не полагайтесь на концепцию «обратного цвета консоли», которая является чуждой разработчикам .NET для Windows, для установки цвета фона.

Если вам нужен более сознательный код (например, вы пишете много отформатированных абзацев со многими выделенными словами), вы можете использовать эту коллекцию вспомогательных методов, вдохновленных Edokan.KaiZen.Colors, для написания кода, как в 3-м пример выше:

public static class Spans
{
    public static Span Black(this string text) => new Span(text) { Color = ConsoleColor.Black };
    public static Span DarkBlue(this string text) => new Span(text) { Color = ConsoleColor.DarkBlue };
    public static Span DarkGreen(this string text) => new Span(text) { Color = ConsoleColor.DarkGreen };
    public static Span DarkCyan(this string text) => new Span(text) { Color = ConsoleColor.DarkCyan };
    public static Span DarkRed(this string text) => new Span(text) { Color = ConsoleColor.DarkRed };
    public static Span DarkMagenta(this string text) => new Span(text) { Color = ConsoleColor.DarkMagenta };
    public static Span DarkYellow(this string text) => new Span(text) { Color = ConsoleColor.DarkYellow };
    public static Span Gray(this string text) => new Span(text) { Color = ConsoleColor.Gray };
    public static Span DarkGray(this string text) => new Span(text) { Color = ConsoleColor.DarkGray };
    public static Span Blue(this string text) => new Span(text) { Color = ConsoleColor.Blue };
    public static Span Green(this string text) => new Span(text) { Color = ConsoleColor.Green };
    public static Span Cyan(this string text) => new Span(text) { Color = ConsoleColor.Cyan };
    public static Span Red(this string text) => new Span(text) { Color = ConsoleColor.Red };
    public static Span Magenta(this string text) => new Span(text) { Color = ConsoleColor.Magenta };
    public static Span Yellow(this string text) => new Span(text) { Color = ConsoleColor.Yellow };
    public static Span White(this string text) => new Span(text) { Color = ConsoleColor.White };
    public static void Render(object[] elements) => ConsoleRenderer.RenderDocument(new Document().AddChildren(elements));
}

† CsConsoleFormat был разработан мной.

2 голосов
/ 18 ноября 2014

Гадкое, но простое решение.

Цвет тега начала переднего плана: <*color*>.Цветная метка конца переднего плана: <*/*>.Начало тега цвета фона: <*!color*>.Тег цвета фона конца: <*/!*>.

Пример использования:

WriteLineColor("<*!red*><*yellow*>Yellow text<*/*> and <*cyan*>cyan text<*/*> on red background.<*/!*>");

Список допустимых цветов (System.ConsoleColor), без учета регистра: черный, DarkBlue, DarkGreen, DarkCyan, DarkRed, DarkMagenta, DarkYellow, серый, темно-серый, синий, зеленый, голубой, красный, пурпурный, желтый, белый.

static void WriteColor(string str)
{
    var fgStack = new Stack<ConsoleColor>();
    var bgStack = new Stack<ConsoleColor>();
    var parts = str.Split(new[] { "<*" }, StringSplitOptions.None);
    foreach (var part in parts)
    {
        var tokens = part.Split(new[] { "*>" }, StringSplitOptions.None);
        if (tokens.Length == 1)
        {
            Console.Write(tokens[0]);
        }
        else
        {
            if (!String.IsNullOrEmpty(tokens[0]))
            {
                ConsoleColor color;
                if (tokens[0][0] == '!')
                {
                    if (Enum.TryParse(tokens[0].Substring(1), true, out color))
                    {
                        bgStack.Push(Console.BackgroundColor);
                        Console.BackgroundColor = color;
                    }
                }
                else if (tokens[0][0] == '/')
                {
                    if (tokens[0].Length > 1 && tokens[0][1] == '!')
                    {
                        if (bgStack.Count > 0)
                            Console.BackgroundColor = bgStack.Pop();
                    }
                    else
                    {
                        if (fgStack.Count > 0)
                            Console.ForegroundColor = fgStack.Pop();
                    }
                }
                else
                {
                    if (Enum.TryParse(tokens[0], true, out color))
                    {
                        fgStack.Push(Console.ForegroundColor);
                        Console.ForegroundColor = color;
                    }
                }
            }
            for (int j = 1; j < tokens.Length; j++)
                Console.Write(tokens[j]);
        }
    }
}

static void WriteLineColor(string str)
{
    WriteColor(str);
    Console.WriteLine();
}

static void WriteColor(string str, params object[] arg)
{
    WriteColor(String.Format(str, arg));
}

static void WriteLineColor(string str, params object[] arg)
{
    WriteColor(String.Format(str, arg));
    Console.WriteLine();
}
0 голосов
/ 05 декабря 2018

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

Вы можете указать любойцвет вам нравится, но это зависит от терминала, поддерживает ли он его или нет.Если этого не произойдет, он приблизится к ближайшему цвету.24-битные цвета доступны в Windows 10 начиная с v1511.PowerShell поддерживает их по умолчанию.

enter image description here

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

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

После этого он готов к печати на консоли.

0 голосов
/ 13 июля 2010

Вот мой вклад, хотя и в Visual Basic:

Sub WriteColor(ByRef part1 As String, ByRef part2 As String)
    Console.Write(part1)
    Console.ForegroundColor = ConsoleColor.Green
    Console.WriteLine(part2)
    Console.ResetColor()
End Sub

Я называю вышеуказанный код следующим образом:

WriteColor("DEBUGMODE INFO: SQL query statement result = ", result.ToString)

Зеленый цвет позволяет мне выбрать результат запроса во всех других отладочных сообщениях, которые я распечатываю. Надеюсь это поможет. Очевидно, что более общее решение, возможно, допускающее переменное число аргументов, будет более полезным, но даже этот конкретный код помогает мне избежать повторений и облегчает жизнь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...