Написавши невеликий інструмент командного рядка, було б непогано виводити різні кольори. Чи можливо це?
Написавши невеликий інструмент командного рядка, було б непогано виводити різні кольори. Чи можливо це?
Відповіді:
Так. Дивіться цю статтю . Ось приклад звідти:
Console.BackgroundColor = ConsoleColor.Blue;
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine("White on blue.");
class Program
{
static void Main()
{
Console.BackgroundColor = ConsoleColor.Blue;
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine("White on blue.");
Console.WriteLine("Another line.");
Console.ResetColor();
}
}
Взято звідси .
Наведені вище коментарі є однозначними відповідями, проте зауважте, що вони не є безпечними для нитки. Якщо ви пишете на консоль з декількома потоками, зміна кольорів додасть умову гонки, яка може створити дивний вигляд. Це легко виправити:
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();
}
}
}
Write
дзвінок не буде приховано. Дивіться stackoverflow.com/questions/4812508/… . Це просто порядок запису-дзвінків, який не є "безпечним".
Я створив невеликий плагін (доступний на NuGet ), який дозволяє додавати будь-який (якщо він підтримується терміналом) колір у вихід консолі без обмежень класичних рішень.
Це працює, розширюючи String
об’єкт, і синтаксис дуже простий:
"colorize me".Pastel("#1E90FF");
Підтримуються як кольори переднього плану, так і фону.
Так, це легко і можливо. Визначте перші кольори за замовчуванням.
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-пакет
Просто для того, щоб додати відповіді вище, які використовують усі Console.WriteLine
: щоб змінити колір в одному рядку тексту, напишіть, наприклад:
Console.Write("This test ");
Console.BackgroundColor = bTestSuccess ? ConsoleColor.DarkGreen : ConsoleColor.Red;
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine((bTestSuccess ? "PASSED" : "FAILED"));
Console.ResetColor();
Так, це можливо наступним чином. Ці кольори можна використовувати в консольній програмі для перегляду деяких помилок у червоному кольорі тощо.
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
Ось простий метод, який я написав для написання консольних повідомлень із вбудованими змінами кольору. Він підтримує лише один колір, але він відповідає моїм потребам.
// 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();
}