C# 控制台状态栏
我有一个函数,可以使用以下语句更新控制台应用程序中的状态栏:C# 控制台状态栏,c#,C#,我有一个函数,可以使用以下语句更新控制台应用程序中的状态栏: Console.writeline("Status {0} Copied", i); 上述语句的问题是,过一段时间后,它会用语句填充控制台行,其中说明: Status 1 Copied Status 2 Copied 等等 有没有办法让它只刷新一行,这样1就会被2取代,依此类推,这样它就不会变成一堵文字墙?没有办法,但您可以尝试一种解决方案,在写入下一条消息之前清除控制台屏幕 Console.Clear(); 您可以尝试另一种方
Console.writeline("Status {0} Copied", i);
上述语句的问题是,过一段时间后,它会用语句填充控制台行,其中说明:
Status 1 Copied
Status 2 Copied
等等
有没有办法让它只刷新一行,这样1就会被2取代,依此类推,这样它就不会变成一堵文字墙?没有办法,但您可以尝试一种解决方案,在写入下一条消息之前清除控制台屏幕
Console.Clear();
您可以尝试另一种方法:“\r”
返回到当前行的开头并重新写入文本
Console.Write("\rStatus {0} copied", i);
否则您可以使用是的,这是完全可能的,您只需跟踪您在哪一行,然后覆盖该行:
Console.Write("0000000000");
Console.SetCursorPosition(3, 0);
Console.Write("55");
Console.ReadLine();
产量:005500000
Console.WriteLine("0000000000");
Console.WriteLine("1111111111");
Console.WriteLine("2222222222");
Console.SetCursorPosition(3, 1);
Console.Write("55");
Console.ReadLine();
输出:
0000000000
115511111
2222要在当前行的开头重复写入输出,请尝试:
private static void SetStatusLineValue(int value)
{
Console.SetCursorPosition(0, Console.CursorTop);
Console.Write("\rStatus {0} Copied", value);
}
甚至简单地说:Console.Write(“\rStatus{0}复制”,value)代码>
对于“记住”起始行或使用指定行的更灵活的解决方案:
private static void SetTextForLine(string text, ref int line)
{
//set the status line for future reference
if (line < 0)
{
line = Console.CursorTop;
}
//save line/cursor state
int currentLine = Console.CursorTop;
bool cursorVisible = Console.CursorVisible;
Console.SetCursorPosition(0, line);
Console.WriteLine(text);
//restore state
Console.CursorTop = (currentLine == line ? currentLine + 1 : currentLine);
Console.CursorVisible = cursorVisible;
}
private static void SetTextForLine(字符串文本,ref int行)
{
//设置状态行以供将来参考
如果(线<0)
{
line=Console.CursorTop;
}
//保存行/光标状态
int currentLine=Console.CursorTop;
bool cursorVisible=Console.cursorVisible;
控制台。设置光标位置(0,行);
控制台写入线(文本);
//恢复状态
Console.CursorTop=(currentLine==line?currentLine+1:currentLine);
Console.CursorVisible=光标可见;
}
用法:
int statusLine = -1;
for (int i = 0; i < 10; i++)
{
Console.WriteLine("Other lines in here...");
DoLongRunningOperation();
//update the status line here
SetTextForLine("Status " + i + " Copied", ref statusLine);
}
int statusLine=-1;
对于(int i=0;i<10;i++)
{
Console.WriteLine(“此处的其他行…”);
多龙运行操作();
//在此处更新状态行
SetTextForLine(“状态”+i+“已复制”,参考状态行);
}
输出:
此处的其他行。。。
状态9复制我接受了答案,因为它帮助我生成了以下代码:
Console.WriteLine("Before Output");
for (int i = 0; i < 10; i++)
{
int currentLine = Console.CursorTop;
Console.WriteLine("i is {0}", i);
Thread.Sleep(500);
Console.SetCursorPosition(0, currentLine);
}
Console.WriteLine("After");
Console.WriteLine(“输出前”);
对于(int i=0;i<10;i++)
{
int currentLine=Console.CursorTop;
WriteLine(“i是{0}”,i);
睡眠(500);
Console.SetCursorPosition(0,currentLine);
}
控制台。写入线(“之后”);
这是我将要使用的代码。您也可以使用方法Console.MoveBufferArea滚动控制台输出
static void Main(string[] args)
{
Console.SetBufferSize(Console.WindowWidth, Console.WindowHeight);
Console.CursorLeft = 0;
Console.CursorTop = 0;
Console.BackgroundColor = ConsoleColor.White;
Console.ForegroundColor = ConsoleColor.Black;
Console.Write("This is the statusbar".PadRight(Console.WindowWidth, ' '));
Console.BackgroundColor = ConsoleColor.Black;
Console.ForegroundColor = ConsoleColor.White;
int line = 1;
int totalLines = 1;
while (true) {
Thread.Sleep(100);
if (line == Console.WindowHeight){
// Scoll one line:
Console.MoveBufferArea(0, 2, Console.WindowWidth, Console.WindowHeight - 2, 0, 1);
line--;
}
Console.CursorLeft = 0;
Console.CursorTop = line;
Console.Write(string.Format("This is line {0}", totalLines));
totalLines++;
line++;
}
}
猜测您的writeline是否在任何循环中?不可能在控制台中编辑任何记录的消息。我希望您使用一些标签,如果您使用winforms,请更改标签的文本。我不这样认为。我认为它只是stdout
,因此只是附加在那里。我想你可以尝试一些用ASCII特殊字符作为退格符的时髦玩意儿,但我不会花钱:)这不会解决他使用WriteLine
时的问题,应该考虑设置光标位置。这是可能的。设置光标位置是一种解决方案,而不是清除屏幕。正如rhughes所说,绝对可能,方法是构建更简单的终端托管UI的基础。