首页 > 解决方案 > C# - 当前行填满时如何防止光标跳转到下一行

问题描述

我正在尝试根据控制台窗口的大小创建自定义大小的边框。问题是当它绘制最后一行时,光标会跳到下一行,这反过来又将最上面的行移出屏幕。

控制台的缓冲区大小与删除滚动条的控制台大小相同,这使得这成为可能。

到目前为止没有最后一行的边框 与最后一行完成边框,创建新行

右边是完整的边框,它创建了一个额外的空间,因为它填满了整行。左边是在做最后一行之前,没有任何问题(因为还没有画到最后一行)。

我当前的代码是:

static void DrawFrame(string[,] frame)
    {
        string[] array = new string[frame.GetLength(1)];
        string output;
        for (int y = 0; y < frame.GetLength(1); y++)
        {
            output = "";
            Console.SetCursorPosition(0, y);
            for (int x = 0; x < frame.GetLength(0); x++)
            {
                output += frame[x, y];

            }
            array[y] = output;
            Console.Write(output);
        }
    }

字符串变量 frame 的值为:

╔══════════════════════╗
║                      ║
║                      ║
║                      ║
║                      ║
║                      ║
║                      ║
║                      ║
║                      ║
║                      ║
║                      ║
╚══════════════════════╝

预期的行为是在做最后一行时不创建额外的行,到目前为止我还没有找到任何解决方案。

任何帮助表示赞赏!

PS: Console.CursorVisible = false;不是解决方案。

PS2:创建边框的代码如下:

static string[,] SetBorder(string[,] frame)
    {
        for (int y = 0; y < frame.GetLength(1); y++)
        {
            for (int x = 0; x < frame.GetLength(0); x++)
            {
                if (y == 0)
                {
                    if (x == 0)
                    {
                        frame[x, y] = "╔";
                    }
                    else if(x == frame.GetLength(0) - 1)
                    {
                        frame[x, y] = "╗";
                    }
                    else
                    {
                        frame[x, y] = "═";
                    }
                }
                else if (y == frame.GetLength(1) - 1)
                {
                    if (x == 0)
                    {
                        frame[x, y] = "╚";
                    }
                    else if (x == frame.GetLength(0) - 1)
                    {
                        frame[x, y] = "╝";
                    }
                    else
                    {
                        frame[x, y] = "═";
                    }
                }
                else
                {
                    if (x == 0 || x == frame.GetLength(0) - 1)
                    {
                        frame[x, y] = "║";
                    }
                    else
                    {
                        frame[x, y] = " ";
                    }
                }
            }
        }
        return frame;
    }

控制台尺寸在开始时也被定义为框架尺寸的尺寸。

Edit1:对于那些试图调试我的代码的人,我会在这里链接它。

标签: c#arrays.netconsole-application

解决方案


您可以Console.SetCursorPosition在代码末尾使用:

Console.SetCursorPosition(0, 0);

请记住,因为您说缓冲区大小等于控制台大小。SetCursorPosition如果您在设置缓冲区大小之前使用,这仍然可以完成。

我以这种方式使用它并且它有效:

DrawFrame(SetBorder(new string[Console.WindowWidth, Console.WindowHeight]));
Console.SetCursorPosition(0, 0);
Console.SetBufferSize(Console.WindowWidth, Console.WindowHeight);

Console.ReadKey();

输出:

控制台窗口输出

更新:

我假设您在 Windows 10 上运行代码。为什么?当我第一次在这里发布我的答案时,我正在工作,在 Windows 7 机器上运行代码,它给出了几个小时前我在上面发布的输出。

现在我在家,在一台 Windows 10 机器上,检查你告诉我的奇怪场景,我测试了我在这里工作的相同代码,你猜怎么着,我遇到了你所说的同样的故障。

为了解决这个问题,我将SetBufferSize函数更改为:

Console.SetBufferSize(Console.WindowWidth, Console.WindowHeight+1);

我添加+1到高度。是的,它确实奏效了。但是,它保持滚动条显示。我将更深入地了解为什么 Win7 和 Win10 之间的差异,以及如何在不看到滚动条的情况下修复它。

根据这个冗长的解释,Windows 7 和 Windows 10 之间的控制台发生了很多变化。我不是那个专家,但我可以有把握地得出结论,所有这些变化都会直接影响我们在代码输出之间的差异在Win7上运行,在Win10上运行。


推荐阅读