linux - .NET 5/6 中如何适配 Linux 终端背色?
问题描述
我们有一个在 Windows/Linux/Mac 上运行的 .NET 5 控制台应用程序。
我们的控制台应用程序依靠经典的前色方案来突出显示控制台中的信息/警告/错误,前色为灰色/黄色/红色。但是,我们无法按照Console.BackgroundColor 文档中的说明收集终端背景颜色:
Unix 系统不提供任何通用机制来获取当前控制台颜色。因此,BackgroundColor 返回 (ConsoleColor)-1,直到它以显式方式设置(使用 setter)。
现在我们强制控制台背景颜色为黑色,但是当终端背景颜色为白色时,这不会很好地呈现:
如果我们可以猜测终端背景颜色,我们可以将前景色调整为终端背景颜色(如果终端背景颜色为白色,则前颜色为黑色,反之亦然)。但是从这个问题的答案如何确定终端的背景颜色?看起来没有标准的方法来获取适用于 Mac 和所有 Linux 的背景颜色。
解决这个问题的常用方法是什么?
解决方案
好的,我们以这种方式找到了解决方案:
- 彩色消息在足够深的背景色上具有白色前色,因此无论用户背景色如何,彩色消息都会突出显示
- 一旦我们修改了
Console.ForegroundColor
andConsole.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");
推荐阅读
- c++ - 独家访问动态共享数据
- python - Dataframe append 和 drop_duplicates 问题
- latex - 如何删除自动放置的 LaTeX 引用?
- django - 如何从 django 的查询集列表中获取表单字段名称
- html - CSS平滑滚动属性不起作用
- logging - 连接问题:Snowflake trail 帐户
- flutter - 未处理的异常:FileSystemException:目录列表失败,
- keras - 为什么亏损停留在高原?
- embedded - 即时更改 USB 配置/接口;由设备发起
- django - 加载带有没有图像的对象的页面时出现 ValueError