c# - 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:对于那些试图调试我的代码的人,我会在这里链接它。
解决方案
您可以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上运行。
推荐阅读
- r - 使用 R 抓取播放数据
- html - 如何在没有伪元素的情况下实现圆角多行?
- html - 如何检查设计中的当前用户是否具有某个属性集
- regex - Bean 验证约束模式:匹配 N 位正则表达式在 XML 中不起作用
- python - 如何使用openCV(python)去除灰色图片中的印章?
- c# - 使用 puppeteerSharp 删除所有脚本元素
- python - 将 Spark Streaming 数据发送回客户端
- java - BiometricPrompt 作为 applocker
- mongodb - Spring WebFlux + MongoDB:可尾游标和聚合
- scala - 面向非分布式并行计算的 Spark 及其性能