我很想知道它是否可以完成,这是我想出的:
private static string ReadBox(int maxLen)
{
var sb = new StringBuilder();
int pos = 0;
bool done = false;
int start = Console.CursorLeft;
while (!done)
{
var ki = Console.ReadKey(true);
switch (ki.Key)
{
case ConsoleKey.Enter:
done = true;
break;
case ConsoleKey.Delete:
// todo
break;
case ConsoleKey.Backspace:
if (pos > 0)
{
pos -= 1;
sb.Remove(pos, 1);
}
break;
case ConsoleKey.LeftArrow:
if (pos > 0) pos -= 1;
break;
case ConsoleKey.RightArrow:
if (pos < sb.Length) pos += 1;
break;
default:
if (ki.KeyChar >= ' ') // simple filter
{
sb.Insert(pos, ki.KeyChar);
pos += 1;
}
break;
}
Console.CursorLeft = start;
Console.Write(sb.ToString());
Console.CursorLeft = start + pos;
}
return sb.ToString();
}
请注意,我们实际上并没有使用 Console。这里的缓冲区中,它被绕过了。哦,我忽略了启动这一切的功能,即最大长度。但是你可以很容易地实现它。
但如果你对这种 UI 很认真,我会四处寻找一个 curses 库,比如这个。但它看起来像是为 Mono 设计的,我什至不确定它是否会在 NET 上运行。四处搜寻。