0

我正在尝试为控制台应用程序制作类似文本框的东西,如何限制Console.In只能从用户输入中读取定义的字符数?

编辑

我无法Readkey()循环,我仍然需要与该框进行交互,例如使用箭头键左右导航,使用 Del 或 Backspace 编辑输入以及一些用于验证的键。ReadKey正在将这些键打印为“”(空格),我不能依赖于计算按下了多少键,因为可能会发生过度打字(在这个项目中,我们需要过度打字!)

我正在考虑从指定位置的缓冲区读取数据,并在达到该字段最大长度时将光标设置到另一个位置。可以这样做吗?

我的机会是什么?我真的需要你的帮助

4

3 回答 3

1

我很想知道它是否可以完成,这是我想出的:

    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 上运行。四处搜寻。

于 2010-04-12T18:34:58.497 回答
1

您不能对 Console.ReadLine() 等设置限制。但您可以制作循环 Console.ReadLine() 例如并验证其中的输入。

于 2010-04-11T20:47:15.800 回答
0

您可以ReadKey循环调用并传递true以防止回声。

于 2010-04-11T21:04:55.807 回答