我正在尝试让我的控制台应用程序自动滚动,但保持文本在顶部。文本历史必须可访问,因此Console.Clear
不可行。
是否有任何方法可以检测控制台何时滚动或任何方法可以调整当前的Y位置,因为我知道当您的文本即将离开屏幕时,控制台将滚动。我希望达到相同的效果,但保持窗口顶部的最新行。任何帮助都将不胜感激,谢谢!
你可以使用Console.SetWindowPosition()
方法。 *
参数
left
Int32
控制台窗口左上角的列位置。
top
Int32
控制台窗口左上角的行位置。
这里有一个示例来演示:
static void Main(string[] args)
{
int i = 0;
while (true)
{
Console.ReadKey(false);
Console.WriteLine($"You are currently at line #{++i}");
Console.SetWindowPosition(0, i - 1);
}
}
Console.BufferHeight
的值,可能会出现 ArgumentOutOfRangeException,即当新位置(顶部)大于 Console.BufferHeight - Console.WindowHeight
时,因此您可能需要考虑这一点。我建议添加一个简单的条件来处理这种情况。示例:int newTop = i - 1;
if (newTop + Console.WindowHeight <= Console.BufferHeight)
{
Console.SetWindowPosition(0, newTop);
}
但您可能希望以不同的方式处理此问题(例如,随着操作增加缓冲区大小,更改窗口大小等)。
* 不要被该方法的名称所误导。这里的“窗口”并不是指操作系统中实际的桌面/控制台窗口(边框等),而是指当前显示的字符缓冲区的窗口。若要移动实际的控制台窗口,您需要使用 SetWindowPos
Windows API 函数。示例。
SetWindowPosition
是这种方法的一个令人困惑的名称,因为它实际上并不影响桌面窗口。您可能希望从其文档中添加这一点到答案中。 - BiesiSetWindowPosition
的缺点是其仅限于 Windows 平台。它在 Linux 上的 .NetCore 系统中尚未工作(已测试 Core3.1.1)。 - AliReza Sabouri
Console.SetCursorPosition()
。 - user12031933SetCursorPosition
只设置 光标 的位置,但它不会滚动内容。根据我的理解,OP 希望实现与手动滚动相同的效果,只显示顶部行。 - 41686d6564 stands w. PalestineConsole.SetWindowPosition()
会为您完成此操作。请注意,这里的“窗口”并不是指实际的控制台窗口本身。有关更多信息,请参见下面的答案。 - 41686d6564 stands w. Palestine