我们有一些方法可以向控制台输出大量彩色文本。
它实际上是一个通过循环数据集构建的菜单。
因为我们逐项编写(并且一行包含许多不同颜色的项目), 这个过程在低端和中端机器上相当慢。在那些机器上,您可以看到每一行都是逐一编写的,这对最终用户来说相当令人沮丧。
此菜单必须多次显示,所以我想知道我是否不能以某种方式“缓存”此输出。如果没有彩色文本,我只需将输出存储在字符串中并一次写入,但我不想丢失颜色信息。
有什么建议吗?
更新:只是为了了解输出的密集程度: 更新2:更新了草率代码,但仍想以某种方式缓冲输出。 MoveBufferArea证明是部分解决方案(它会创建不需要的滚动条)
DefaultBanner();
WriteLine("Available tests:\n", ConsoleColor.White);
var methodNames = methods.Select(m => ((TestAttribute)m.GetCustomAttributes(false)[0]).Name).ToArray();
int vertical = 0;
for (int i = 1; i <= methods.Length; i++)
{
if (i > methods.Length / 2)
{
Console.SetCursorPosition(40, 4 + vertical++);
}
Write("(");
Write(i, ConsoleColor.Yellow);
WriteLine(") {0:00}", methodNames[i - 1]);
}
Write("\n(");
Write(items.Count + 1, ConsoleColor.Yellow);
Write(") Set address | (");
Write(items.Count + 2, ConsoleColor.Yellow);
Write(") View Log | (");
Write(items.Count + 3, ConsoleColor.Yellow);
Write(") Open Log directory \n(");
Write(items.Count + 4, ConsoleColor.Yellow);
Write(") Open configuration | (");
Write(items.Count + 5, ConsoleColor.Yellow);
Write(") View current configuration | (");
Write(items.Count + 6, ConsoleColor.Yellow);
WriteLine(") Quit");
Write("\nYour selection: ");
int command = 0;
while (!ConsoleReader<int>.TryReadValueInRange(1, items.Count + 6,out command));
return command;
Write方法只是封装某些行为的辅助方法 System.Console类,所以我们不必继续设置颜色。
答案 0 :(得分:2)
也许你可以使用MoveBufferArea功能聪明一些。如果您的缓冲区区域当前对用户不可见,那该怎么办?您可以在那里创建缓冲区\菜单,然后一次性将整个区域复制到可见缓冲区的一部分。我不知道你对缓冲区的可见/不可见区域有多少控制权,如果你能像这样使用它们,那只是一个建议。
我能想到的唯一另一个选择就是创建一个模仿控制台的控件。然后,您可以进行允许缓冲的读/写操作,或者只有在进行了多次更改后才进行刷新。但这可能是一项额外的工作。
答案 1 :(得分:2)
有没有办法将属性评估逻辑“移出循环外”?我怀疑它不是你代码中最快的部分。
答案 2 :(得分:1)
我不知道你的项目是否可行,但是一个选项是使用某种类型的标记语言将颜色存储在字符串本身中,例如<yellow>Text in yellow</yellow>
(或者你可以使用普通的CSS选择器, 管他呢)。这样就可以使用普通的字符串缓存。
顺便提一下,记住.NET Framework已经实现了一个这样的缓存:请参阅String.Intern和String.IsInterned。
答案 3 :(得分:1)
请记住,控制台是一个可配置的设备,这意味着您可以编写自己的设备(虽然我不推荐它)。有一种方法可以在配置文件中指定哪个类执行跟踪以及哪个类执行调试输出。
答案 4 :(得分:1)
有没有办法让客户确保他们正在运行硬件加速图形(检查驱动程序)?如果它们使用VGA-only默认Microsoft驱动程序运行,那么控制台将非常缓慢。