首页 > 解决方案 > .NET 5/6 中如何适配 Linux 终端背色?

问题描述

我们有一个在 Windows/Linux/Mac 上运行的 .NET 5 控制台应用程序。

我们的控制台应用程序依靠经典的前色方案来突出显示控制台中的信息/警告/错误,前色为灰色/黄色/红色。但是,我们无法按照Console.BackgroundColor 文档中的说明收集终端背景颜色:

Unix 系统不提供任何通用机制来获取当前控制台颜色。因此,BackgroundColor 返回 (ConsoleColor)-1,直到它以显式方式设置(使用 setter)。

现在我们强制控制台背景颜色为黑色,但是当终端背景颜色为白色时,这不会很好地呈现: NDepend 控制台背景

如果我们可以猜测终端背景颜色,我们可以将前景色调整为终端背景颜色(如果终端背景颜色为白色,则前颜色为黑色,反之亦然)。但是从这个问题的答案如何确定终端的背景颜色?看起来没有标准的方法来获取适用于 Mac 和所有 Linux 的背景颜色。

解决这个问题的常用方法是什么?

标签: linuxmacosterminal.net-5backcolor

解决方案


好的,我们以这种方式找到了解决方案:

  • 彩色消息在足够深的背景色上具有白色前色,因此无论用户背景色如何,彩色消息都会突出显示
  • 一旦我们修改了Console.ForegroundColorandConsole.BackgroundColor以显示彩色消息,精明的方法是调用Console.ResetColor()将前后颜色设置为默认值

无论终端的默认颜色如何,这都有效。

在此处输入图像描述

需要注意的一点是,您不应调用Console.WriteLine(text)这会在剩余的行字符上引发一些背景颜色问题。而是先调用 Console.Write(text)Console.ResetColor()然后通过调用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");

推荐阅读