.NET 5/6如何适配Linux终端背景色?
How to adapt to Linux terminal back color in .NET 5/6?
我们有一个在 Windows/Linux/Mac 上运行的 .NET 5 控制台应用程序。
我们的控制台应用程序依赖于经典的前景颜色方案,在控制台中使用前景颜色 gray/yellow/red 突出显示 info/warning/error。但是,我们无法按照 Console.BackgroundColor documentation:
中的说明收集终端背景颜色
Unix systems don't provide any general mechanism to fetch the current
console colors. Because of that, BackgroundColor returns
(ConsoleColor)-1 until it is set in explicit way (using the setter).
现在我们强制控制台背景颜色为黑色,但是当终端背景颜色为白色时,这并不能很好地呈现:
如果我们能猜出终端背景颜色,我们就可以使前景色适应终端背景颜色(如终端背景颜色为白色时为黑色前景色,反之亦然)。但是从这个问题 How to determine a terminal's background color? 的答案来看,似乎没有标准的方法来获取适用于 Mac 和所有 Linux.
的背景颜色
解决这个问题的常用方法是什么?
好的,我们通过这种方式找到了解决方案:
- 彩色消息在足够深的背景色上有白色前景色,因此无论用户背景色如何,彩色消息都会突出显示
- 一旦我们修改了
Console.ForegroundColor
和 Console.BackgroundColor
以显示彩色消息,聪明的做法是调用 Console.ResetColor()
将前后颜色设置为默认值
无论终端的默认颜色如何,这都有效。
需要注意的一点是,您不应调用 Console.WriteLine(text)
这会在剩余的行字符上引起一些背景色问题。而是在 Console.ResetColor()
之前调用 Console.Write(text)
,然后通过调用 Console.WriteLine()
.
获得换行符
System.Console.WriteLine("This is an info A");
System.Console.ForegroundColor = ConsoleColor.White;
System.Console.BackgroundColor = ConsoleColor.Red;
System.Console.Write("This is an error");
System.Console.ResetColor();
System.Console.WriteLine();
System.Console.WriteLine("This is an info B");
System.Console.ForegroundColor = ConsoleColor.White;
System.Console.BackgroundColor = ConsoleColor.DarkYellow;
System.Console.Write("This is a warning");
System.Console.ResetColor();
System.Console.WriteLine();
System.Console.WriteLine("This is an info C");
System.Console.ForegroundColor = ConsoleColor.White;
System.Console.BackgroundColor = ConsoleColor.Green;
System.Console.Write("This is a success");
System.Console.ResetColor();
System.Console.WriteLine();
System.Console.WriteLine("This is an info D");
我们有一个在 Windows/Linux/Mac 上运行的 .NET 5 控制台应用程序。
我们的控制台应用程序依赖于经典的前景颜色方案,在控制台中使用前景颜色 gray/yellow/red 突出显示 info/warning/error。但是,我们无法按照 Console.BackgroundColor documentation:
中的说明收集终端背景颜色Unix systems don't provide any general mechanism to fetch the current console colors. Because of that, BackgroundColor returns (ConsoleColor)-1 until it is set in explicit way (using the setter).
现在我们强制控制台背景颜色为黑色,但是当终端背景颜色为白色时,这并不能很好地呈现:
如果我们能猜出终端背景颜色,我们就可以使前景色适应终端背景颜色(如终端背景颜色为白色时为黑色前景色,反之亦然)。但是从这个问题 How to determine a terminal's background color? 的答案来看,似乎没有标准的方法来获取适用于 Mac 和所有 Linux.
的背景颜色解决这个问题的常用方法是什么?
好的,我们通过这种方式找到了解决方案:
- 彩色消息在足够深的背景色上有白色前景色,因此无论用户背景色如何,彩色消息都会突出显示
- 一旦我们修改了
Console.ForegroundColor
和Console.BackgroundColor
以显示彩色消息,聪明的做法是调用Console.ResetColor()
将前后颜色设置为默认值
无论终端的默认颜色如何,这都有效。
需要注意的一点是,您不应调用 Console.WriteLine(text)
这会在剩余的行字符上引起一些背景色问题。而是在 Console.ResetColor()
之前调用 Console.Write(text)
,然后通过调用 Console.WriteLine()
.
System.Console.WriteLine("This is an info A");
System.Console.ForegroundColor = ConsoleColor.White;
System.Console.BackgroundColor = ConsoleColor.Red;
System.Console.Write("This is an error");
System.Console.ResetColor();
System.Console.WriteLine();
System.Console.WriteLine("This is an info B");
System.Console.ForegroundColor = ConsoleColor.White;
System.Console.BackgroundColor = ConsoleColor.DarkYellow;
System.Console.Write("This is a warning");
System.Console.ResetColor();
System.Console.WriteLine();
System.Console.WriteLine("This is an info C");
System.Console.ForegroundColor = ConsoleColor.White;
System.Console.BackgroundColor = ConsoleColor.Green;
System.Console.Write("This is a success");
System.Console.ResetColor();
System.Console.WriteLine();
System.Console.WriteLine("This is an info D");